Java官方(Oracle/Sun)发布的JDK和OpenJDK的关系

最近一阶段,通过AndroidStudio一直在看AndroidJava的源码。发现Android SDK下有Java源码,JDK1.8下也有Java源码,但是内容大同小异。
这里写图片描述
看JDK源码的时候,还会提醒内容反编译自二进制文件,如下:
这里写图片描述
然后在网上找到了R大的解释,来自R大的知乎回答

在Oracle参与过HotSpot VM的研发。这个我有发言权。Oracle JDK与OpenJDK里的JVM都是HotSpot VM。从源码层面说,两者基本上是同一个东西。从JDK7开始,Oracle JDK里的HotSpot VM,在研发的时候其实就是用放在http://openjdk.java.net上OpenJDK的Mercurial代码库。也就是说跟大家从外部能实时看到的OpenJDK用的是同一个代码库。HotSpot VM只有非常非常少量的功能没有在OpenJDK里,那部分在Oracle内部的代码库里。这些私有部分都不涉及JVM的核心功能。所以当一个Oracle员工要构建OpenJDK时,他要做的事情跟外面的人一样:从http://hg.openjdk.java.net签出代码,构建。而当他要构建Oracle JDK时,他同样需要先从http://hg.openjdk.java.net签出OpenJDK,然后从Oracle内部的代码库签出私有的部分,放在OpenJDK代码下的一个特定目录里,然后构建。这些HotSpot VM私有的部分主要是Java Flight Recorder的内部实现,以及还有没有公开到OpenJDK的其它平台的port,例如Oracle自己的ARM、PPC版HotSpot VM。事实上我以前在Oracle做HotSpot VM的开发时,通常都不签出私有部分的代码,而是直接用OpenJDK的部分来开发。只有到最后要提交代码到JPRT的时候我才会把私有的部分签出来(不然有些私有测试跑不过)。=================================JDK6的代码,由于历史原因,Sun JDK6跟OpenJDK6的代码并不同步。但是其中的HotSpot VM仍然是相对一致的。OpenJDK 6里的HotSpot VM只缺了一个Oracle JDK里才有的优化,那就是-XX:+UseCompressedString。这个功能实现得不太好,没带进JDK7/OpenJDK7,所以这点差异没有也罢。另外,Sun JDK6跟OpenJDK6在切代码的时候不一定是在同一天,所以同一个大版本号(例如HotSpot 20.0)里面的内容可能会稍微有点不一样。例子之一就是Oracle/Sun JDK6u25里有完整的tiered compilation系统的实现,而OpenJDK6对应的HotSpot 20.0却没包含这个实现;同一时间的OpenJDK7分支里的HotSpot VM又有这个功能,说明这个功能本身并不是啥私有功能,只是OpenJDK6切代码的时间有可能比Oracle/Sun JDK6u25早了点。=================================下面有评论提醒了我补充一点:Oracle JDK只发布二进制安装包,而OpenJDK只发布源码。如果使用跟Oracle一样的平台(操作系统/编译器/系统库)来构建OpenJDK,那么得到的二进制的JVM就会跟Oracle JDK里的基本上一样(除了私有部分功能之外)。但是如果用相当不同的编译器(例如说不同大版本的GCC)来构建,得到的二进制JVM可能会有奇怪的bug⋯

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值