简介与历史
众所周知,从Java 7开始,OpenJDK是Java的参考实现(RI)。 下面的时间轴使您对OpenJDK的历史有了一个了解:
有关更多详细信息,请参见采用OpenJDK –过去,现在和将来 [1] 。
如果您想知道从Oracle,Red Hat等供应商处下载的JDK或JRE二进制文件,则可能是这些线索均来自OpenJDK。 然后,每个供应商都会添加一些由于安全性,专有性或其他原因而尚未开源的额外人工制品。
OpenJDK是由什么制成的?
OpenJDK由许多存储库组成,即corba,hotspot,jaxp,jaxws,jdk,langtools和nashorn。 在OpenjJDK8和OpenJDK9之间,没有引入任何新的存储库,而是进行了许多新的更改和重组,这主要归功于Jigsaw – Java本身的模块化[ 2 ] [ 3 ] [ 4 ] [ 5 ]。
多年来,Java语言和平台是如何构建的?
Java是通过引导Java的较早(先前)版本来构建的,即Java是使用Java本身作为其构建块来构建的。 将旧的组件放在一起以创建新的组件,该组件在下一阶段将成为构建块。 在Scratch [6 ]的 Scheme甚至在Wikipedia [7]上都可以找到引导的一个很好的例子。
使用JDK7编译和构建OpenJDK8 [8],类似地,使用JDK8编译和构建OpenJDK9 [9]。 理论上,可以使用从OpenJDK8创建的映像来编译OpenJDK8,类似于使用OpenJDK9的OpenJDK9。 使用称为启动周期映像的过程–创建OpenJDK的JDK映像,然后使用同一映像,再次编译OpenJDK,这可以使用make命令选项来完成:
$ make bootcycle-images # Build images twice, second time with newly built JDK
make在OpenJDK8和OpenJDK9下提供了许多选项,您可以通过命名它们来构建单个组件或模块,即
$ make [component-name] | [module-name]
甚至并行运行多个构建过程,即
$ make JOBS=<n> # Run <n> parallel make jobs
最后使用install选项安装构建的人工制品,即
$ make install
一些神话破灭了
更具体而言,OpenJDK或Hotspot并不是完全用C / C ++编写的,代码库的很大一部分是好的ole Java(请参见上面的组成图)。 因此,您不必成为铁杆开发人员即可为Open JDK做出贡献。 甚至底层的C / C ++代码代码库也不令人恐惧或令人生畏。 例如,这是从vm / memory / universe.cpp中提取的代码片段。
在HotSpotrepo中– http://hg.openjdk.java.net/jdk6/jdk6/hotspot/raw-file/a541ca8fa0e3/src/share/vm/memory/universe.cpp [10]:
.
.
.
Universe::initialize_heap()
if (UseParallelGC) {
#ifndef SERIALGC
Universe::_collectedHeap = new ParallelScavengeHeap();
#else // SERIALGC
fatal("UseParallelGC not supported in this VM.");
#endif // SERIALGC
} else if (UseG1GC) {
#ifndef SERIALGC
G1CollectorPolicy* g1p = new G1CollectorPolicy();
G1CollectedHeap* g1h = new G1CollectedHeap(g1p);
Universe::_collectedHeap = g1h;
#else // SERIALGC
fatal("UseG1GC not supported in java kernel vm.");
#endif // SERIALGC
} else {
GenCollectorPolicy* gc_policy;
if (UseSerialGC) {
gc_policy = new MarkSweepPolicy();
} else if (UseConcMarkSweepGC) {
#ifndef SERIALGC
if (UseAdaptiveSizePolicy) {
gc_policy = new ASConcurrentMarkSweepPolicy();
} else {
gc_policy = new ConcurrentMarkSweepPolicy();
}
#else // SERIALGC
fatal("UseConcMarkSweepGC not supported in this VM.");
#endif // SERIALGC
} else { // default old generation
gc_policy = new MarkSweepPolicy();
}
Universe::_collectedHeap = new GenCollectedHeap(gc_policy);
}
.
.
.
(请注意,以上代码段自此处发布以来可能已更改)
从上面的代码块中可以明显看出,我们正在研究如何使用预编译器符号来创建支持某种类型的GC(即串行GC或并行GC)的Hotspot代码。 同样,在切换一个或多个GC开关时,在上面的代码块中也选择了GC策略的类型,即,启用后使用UseAdaptiveSizePolicy选择“ 异步并发标记 和扫描”策略。 如果未选择“使用串行GC”或“使用并发标记扫描GC”,则选择的GC策略是“标记并扫描”策略。 所有这些以及更多内容都清晰易读且冗长,而不仅仅是格式精美的代码,其读法像英语。
可以在“ 采用OpenJDK中级和高级体验 [11]”文档中名为“深潜热点”的部分中找到更多评论。
建立您自己的JDK或JRE的步骤
前面我们提到了JDK和JRE映像–这些不再仅对Java世界的大型公司开放,您和我可以很容易地构建此类映像。 该过程的步骤已得到简化,有关快速入门的信息,请参见《 采用OpenJDK入门工具包》 [12]和《 采用OpenJDK中级和高级体验》 [11]文档。 有关相同步骤的详细版本,请参见“ 采用OpenJDK 主页” [13]。 基本上,从OpenJDK代码库构建JDK映像可归结为以下命令:
(已简化了设置步骤,并省略了一些命令,有关详细步骤,请参见上面的链接)
$ hg clone http://hg.openjdk.java.net/jdk8/jdk8 jdk8 (a)...OpenJDK8
要么
$ hg clone http://hg.openjdk.java.net/jdk9/jdk9 jdk9 (a)...OpenJDK9
$ ./get_sources.sh(b)
$ bash配置(c)
$制作清晰的图像(d)
(已简化了设置步骤,并省略了一些命令,有关详细步骤,请参见上面的链接)
要解释以上每个步骤中发生的情况:
(a)我们像使用git clone一样克隆openjdk mercurial回购。
(b)完成步骤(a)后,转到创建的文件夹,然后运行get_sources.sh命令,该命令等效于git fetch或git pull,因为步骤(a)仅降低了基础文件而不是所有文件和文件夹。
(c)在这里,我们运行一个脚本,该脚本检查并创建进行编译和构建过程所需的配置
(d)步骤(c)成功完成后,我们将执行完整的编译,构建并根据构建的工件创建JDK和JRE映像
如您所见,这些是构建伪影或JDK / JRE图像所遵循的简单步骤[步骤(a)仅需要运行一次]。
好处
- 促进Java语言和平台的发展和改进
- 了解语言和平台的内部知识
- 在执行上述操作的同时,了解OS平台和其他技术
- 参与F / OSS项目
- 紧跟Java / JVM领域的最新变化
- 可以从专业上帮助的知识和经验,但其他来源(例如书籍,培训,工作经验,大学课程等)也很难获得
- 职业发展
- 个人发展(软技能和人际网络)
有助于
加入Adopt OpenJDK [14]和Betterrev [15]项目,并通过向我们提供有关Java包括这些项目的所有内容的反馈来做出贡献。 首先加入“采用讨论”邮件列表和其他与OpenJDK相关的邮件列表,它们将使您随时了解最新进展和对OpenJDK的更改。 分叉您看到的任何项目,并通过拉取请求提交更改。
谢谢和支持
在JCP [21], Openjdk团队 [22],JUG(例如伦敦Java Community) [16], SouJava [17]和巴西的其他JUG的帮助下, 采用OpenJDK [14]和伞项目得到了支持和进展。欧洲的水罐,例如BGJUG(保加利亚水罐) [18], BeJUG(比利时水罐) [19], 马其顿水罐 [20],以及许多其他小型水罐。 我们希望在不久的将来有更多的JUG和个人参与其中。 如果您或您的JUG希望参加,请联系。
翻译自: https://www.javacodegeeks.com/2014/12/how-is-java-jvm-built-adopt-openjdk-is-your-answer.html