Excel不相邻列如何打印在一起-英雄云拓展知识分享
133
2023-11-07
【摘要】 本书摘自《深入理解 Java 虚拟机 JVM 高级特性与最佳实践(第3版)》一书中第1章,第6节,周志明著。
1.6 实战 自己编译JDK
想要窥探Java 虚拟机内部的实现原理,最直接的一条路径就是编译一套自己的JDK, 通过阅读和跟踪调试JDK 源码来了解Java 技术体系的运作,虽然这样门槛会比阅读资料更 高一点,但肯定也会比阅读各种文章、书籍来得更加贴近本质。此外,Java 类库里的很多 底层方法都是 Native 的,在了解这些方法的运作过程,或对JDK 进行 Hack(根据需要进行 定制微调)的时候,都需要有能自行编译、调试虚拟机代码的能力。
现在网络上有不少开源的JDK 实现可以供我们选择,但毫无疑问OpenJDK 是使用得 最广泛的 JDK, 我们也将选择 OpenJDK 来进行这次编译实战。
1.6.1 获取源码
编译源码之前,我们要先明确 OpenJDK和 OracleJDK 之 间 、OpenJDK 的各个不同版 本之间存在什么联系,这有助于确定接下来编译要使用的JDK 版本和源码分支,也有助于 理解我们编译出来的 JDK与 Oracle 官方提供的 JDK 有什么差异。
从前面介绍的Java 发展史中我们已经知道 OpenJDK 是 Sun 公司在2006年年末把 Java 开源而形成的项目,这里的“开源”是通常意义上的源码开放形式,即源码是可被复用的, 例如 OracleJDK、Oracle OpenJDK、AdoptOpenJDK、Azul Zulu 、SAP SapMachine 、Amazon Corretto 、IcedTea 、UltraViolet 等都是从OpenJDK 源码衍生出的发行版。但如果仅从“开 源”字面意义(开放可阅读的源码)上讲的话,其实Sun 公司自JDK5 时代起就曾经以JRL (Java Research License) 的形式公开过Java 的源码,主要是开放给研究人员阅读使用,这 种JRL 许可证的开放源码一直持续到JDK6 Update 23才因 OpenJDK 项目日渐成熟而终 止。如果拿 OpenJDK 中的源码跟对应版本的JRL 许可证形式开放的 Sun/OracleJDK 源码互 相比较的话,会发现除了文件头的版权注释之外,其余代码几乎都是相同的,只有少量涉
及引用第三方的代码存在差异,如字体栅格化渲染,这部分内容OracleJDK 采用了商业实 现,源码版权不属于Oracle 自己,所以也无权开源,而OpenJDK 中使用的是同样开源的 FreeType 代替。
当然,笔者说的“代码相同”必须建立在两者共有的组件基础之上,OpenJDK 中的源 码仓库只包含了标准Java SE的源代码,而一些额外的模块,典型的如JavaFX, 虽然后来也 是被Oracle 开源并放到 OpenJDK组织进行管理 (OpenJFX 项目),但是它是存放在独立的 源码仓库中,因此 OracleJDK 的安装包中会包含JavaFX 这种独立的模块,而用 OpenJDK 的话则需要单独下载安装。
此外,在JDK 11以 前 ,OracleJDK 中还会存在一些 OpenJDK 没有的、闭源的功能,即 OracleJDK 的“商业特性”。例如JDK8 起从JRockit移植改造而来的Java Flight Recorder 和 Java Mission Control组件、JDK10 中的应用类型共享功能 (AppCDS) 和 JDK 11 中的 ZGC收集器,这些功能在 JDK 11时才全部开源到了OpenJDK 中。到了这个阶段,我们已经可以认为 OpenJDK 与 OracleJDK 代码实质上°已达到完全一致的程度。
根 据Oracle 的项目发布经理 Joe Darcy 在 OSCON 大会上对两者关系的介绍③也证实了 OpenJDK 和 OracleJDK 在程序上是非常接近的,两者共用了绝大部分相同的代码(如图1-7 所示,注意图中的英文提示了两者共同代码的占比要远高于图形上看到的比例),所以我们 编译的OpenJDK, 基本上可以认为性能、功能和执行逻辑上都和官方的 OracleJDK 是一 致的。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们 18664393530@aliyun.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~