OpenJDK和OracleJDK的区别

在2006年11月13日的JavaOne大会上,Sun公司(当时还没被收购)宣布计划要把Java开源,在随后的一年多时间内,它陆续地将JDK的各个部分在GPL v2(GNU General Public License v2)协议下公开了源码,并建立了OpenJDK组织对这些源码进行独立管理。除了极少量的产权代码(Encumbered Code,这部分代码所有权不属于Sun公司,Sun本身也无权进行开源处理)外,OpenJDK几乎拥有了当时SunJDK 的全部代码。

OpenJDK的质量主管曾经表示在JDK 7中,SunJDK和OpenJDK除了代码文件头的版权注释之外,代码几乎是完全一样的,所以OpenJDK 7与SunJDK 7本质上就是同一套代码库出来的产品。

总结下来,OpenJDK和OracleJDK存在以下方面的区别:

授权协议不同

OpenJDK 采用GPL V2协议放出,而OracleJDK则采用JRL放出。两者协议虽然都是开放源代码的,但是在使用上的不同在于GPL V2允许在商业上使用,而JRL只允许个人研究使用。

OpenJDK不包含OracleJDK中的部分产权代码

由于OracleJDK中的部分代码的产权也不是归Oracle所有的,所以这部分代码就没开源到OpenJDK中。但是很多“好心”的开源爱好者在OpenJDK中实现了相同的功能,并将源代码开源到OpenJDK中。比如说字体栅格化引擎,使用Free Type代替。

不能使用Java商标

在Sun被Oracle收购以后,Java这个商标就归Oracle所有了。不仅OpenJDK不能使用java商标,J2EE这个曾经Sun的亲儿子命运也同样坎坷,已经被Oracle无情抛弃,同样
不能在使用Java商标。

但是随着JDK版本的不断发布,Oracle失去了维护OpenJDK的耐心,因为不赚钱啊。RedHat从Oracle手上接过OpenJDK的管理权利和维护职责。

2019年3月20日,JDK 12发布,只包含8个JEP,其中主要有Switch表达式、Java微测试套件(JMH)等新功能,最引人注目的特性无疑是加入了由RedHat领导开发的Shen-andoah垃圾收集器。Shenandoah作为首个由非Oracle开发的垃圾收集器,其目标又与Oracle在JDK 11中发布的ZGC几乎完全一致,两者天生就存在竞争。Oracle马上用实际行动抵制了这个新收集器,在JDK 11发布时才说应尽可能保证OracleJDK和OpenJDK的兼容一致,转眼就在OracleJDK 12里把Shenandoah的代码通过条件编译强行剔除掉,使其成为历史上唯一进入了OpenJDK发布清单,但在OracleJDK中无法使用的功能。

所以对于高版本的OpenJDK和OracleJDK之间,也存在OpenJDK中有的功能,但是OracleJDK中不包含的。

总的来说,对于普通开发,使用OpenJDK和OracleJDK并没有太大差别,两者的差别更体现在商业考量上面。

一些问题

具体有哪些功能是OracleJDK中有,但是OpenJDK中不包含的。欢迎开发经验丰富的大神评论留言。