Java / JVM是如何构建的? 采用OpenJDK是您的答案!

简介与历史

众所周知,从Java 7开始,OpenJDK是Java的参考实现(RI)。 下面的时间轴使您对OpenJDK的历史有了一个了解:



OpenJDK历史(2006年至今)

OpenJDK历史(2006年至今)

有关更多详细信息,请参见采用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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值