Mongoosej.Blog.Software.Programing.Java.JDK.Overview


JDK派系

OpenJDK

Java最早由SUN公司(Sun Microsystems,发起于美国斯坦福大学,SUN是Stanford University Network的缩写)发明,2006年SUN公司将Java开源,此时的JDK即为OpenJDK。OpenJDK是Java SE的开源实现,他由SUN和Java社区提供支持,2009年Oracle收购了Sun公司,自此Java的维护方之一的SUN也变成了Oracle。大多数JDK都是在OpenJDK的基础上编写实现的,比如IBM J9,Azul Zulu,Azul Zing和Oracle JDK。

几乎现有的所有JDK都派生自OpenJDK,他们之间不同的是许可证,OpenJDK根据许可证GPL v2发布。Oracle JDK根据Oracle二进制代码许可协议获得许可。

OracleJDK

Oracle JDK之前被称为SUN JDK,显而易见,这是在2009年Oracle收购SUN公司之前,收购后被命名为Oracle JDK。实际上,Oracle JDK是基于OpenJDK源代码构建的,因此Oracle JDK和OpenJDK之间没有重大的技术差异。

OpenJDK 7和Oracle JDK 7在程序上是非常接近的,两者共用了大量相同的代码,我们编译的OpenJDK基本上可以认为性能、功能和执行逻辑上都和官方的Oracle JDK是一致的。
JDK - 图1

OpenJDK和OracleJDK的区别

再粗暴些地说,OpenJDK是开源的,Oracle JDK是官方的,从网站就能看出一些端倪,OpenJDK界面如此粗糙(OpenJDK),朋友们可能从中看出了SUN的影子。

命令行中使用java -version,可以看到JDK的版本,如果是Oracle JDK,会显示:

  1. cmd>java -version
  2. java version "1.7.0_79"
  3. Java(TM) SE Runtime Environment (build 1.7.0_79-b15)
  4. Java HotSpot(TM) 64-Bit Server VM (build 24.79-b02, mixed mode)

其中Java HotSpot(TM) 64-Bit Server VM表明,此JDK的JVM是Oracle的64位HotSpot虚拟机,运行在Server模式下。Java(TM) SE Runtime Environment (build 1.8.0_162-b12)是Java运行时环境(即JRE)的版本信息。

如果是OpenJDK,会显示:

  1. cmd>java -version
  2. openjdk version "11-ea" 2018-09-25
  3. OpenJDK Runtime Environment (build 11-ea+28)
  4. OpenJDK 64-Bit Server VM (build 11-ea+28, mixed mode, sharing)

主要的Linux发行版(例如这些常见的Ubuntu、Fedora和Red Hat Enterprise Linux)提供OpenJDK或其变体作为系统默认的Java SE的实现。

Oracle JDK 与 OpenJDK 里的 JVM 都是 HotSpot VM。

授权协议的不同

OpenJDK采用GPL V2协议放出,而Oracle JDK则采用JRL放出。两者协议虽然都是开放源代码的,但是在使用上的不同在于GPL V2允许在商业上使用,而JRL只允许个人研究使用。OpenJDK不包含Deployment(部署)功能:部署的功能包括:Browser Plugin、Java Web Start、以及Java控制面板,这些功能在OpenJDK中是找不到的。

OpenJDK源代码不完整

这个很容易想到,在采用GPL协议的OpenJDK中,SUN JDK的一部分源代码因为产权的问题无法开放给OpenJDK使用,其中最主要的部份就是JMX中的可选元件SNMP部份的代码。因此这些不能开放的源代码 将它作成plug,以供OpenJDK编译时使用,你也可以选择不要使用plug。而Icedtea则为这些不完整的部分开发了相同功能的源代码 (OpenJDK6),促使OpenJDK更加完整。

部分源代码用开源代码替换

由于产权的问题,很多产权不是SUN的源代码被替换成一些功能相同的开源代码,比如说字体栅格化引擎,使用Free Type代替。

OpenJDK只包含最精简的JDK

OpenJDK不包含其他的软件包,比如Rhino Java DB JAXP…,并且可以分离的软件包也都是尽量的分离,但是这大多数都是自由软件,你可以自己下载加入。

不能使用Java商标

这个很容易理解,在安装OpenJDK的机器上,输入“java -version”显示的是OpenJDK,但是如果是使用Icedtea补丁的OpenJDK,显示的是java。

版权

OpenJDK是开源协议,拥有自由的再分发权,所以,你可以在你发行的软件中直接内置一份OpenJDK,比如AndroidStudio,Intellij IDEA,以及JB全家桶等等软件都是内置OpenJDK的。

而OracleJDK是商业协议,用户不具备再分发权,除非单独购买再分发权。没有再分发权就意味着你不能把OracleJDK打包在你的应用软件中一起发布(这是侵权)。只能要求客户去单独下载OracleJDK。

所以你可以这样思考问题:在使用上的区别就是,OracleJDK不能与你的应用一起打包发布,OpenJDK可以。
至于从甲骨文的换到OpenJDK能不能运行?这个问题要具体问题具体分析,建议测试之后再下结论。一般来说可以正常运行,但不排除某些特殊情况的存在。所以建议是你的程序最好一开始就面向OpenJDK开发,否则,切换到OpenJDK肯定是需要发一轮全面测试才敢上线的。

性能

有两者之间没有真正的技术差别,因为针对Oracle JDK构建过程是基于OpenJDK的。在性能方面,Oracle在响应能力和JVM性能方面要好得多。由于其对企业客户的重要性,它更加关注稳定性。相比之下,OpenJDK将更频繁地发布版本。结果,我们可能遇到不稳定的问题。根据社区反馈,我们知道一些OpenJDK用户遇到了性能问题。

发展与人气

Oracle JDK由Oracle Corporation完全开发,而OpenJDK由Oracle,OpenJDK和Java Community开发。然而,红帽,Azul Systems,IBM,Apple Inc.,SAP AG等顶级公司也积极参与其开发。

当涉及到在其工具中使用Java开发工具包的顶级公司(例如Android Studio或IntelliJ IDEA)的流行时,Oracle JDK更受欢迎,他们都已经切换到基于OpenJDK的JetBrains 构建。

另一方面,主要的Linux发行版(Fedora,Ubuntu,Red Hat Enterprise Linux)提供OpenJDK作为默认的Java SE实现。

其他

StackOverflow上的这篇文章《What is the difference between JVM, JDK, JRE & OpenJDK?》,可以说各路大神回答了关于JVM、JDK、JRE和OpenJDK之间区别的问题,其中有个人的回答言简意赅:

OpenJDK is an open source version of sun JDK. Oracle JDK is Sun’s official JDK.

另外,这篇文章《Update for JDK 11 - An article from Donald Smith try to disambiguate the difference between Oracle JDK and Oracle’s OpenJDK》,介绍了更新版本Oracle JDK和OpenJDK的区别,有兴趣的朋友,可以拜读。其中非常有意思的是这篇文章的博主,是Insights and updates on Java SE and OpenJDK from the Java Platform Group Product Management Team,竟然有这种团队,说明Oracle JDK和OpenJDK并不是绝对的竞争对手,他们的存在还是有意义的,这就是所谓“存在即合理”。

OpenJDK与IcedTea的关系

IcedTea项目最初是由于OpenJDK不完整(因产权 而造成的障碍)而创立的,社区需要一个完整的开源工具链及代码库。IcedTea长期以来一直是OpenJDK的一套补丁,正如刚才我所说到的,它有一个 基于“./configure”的不同的构建系统。

在OpenJDK中,我们已经替换了产权代码(encumbered code),因此不再有障碍了。正因为我们的努力,IcedTea项目已经减少了使用补丁的数量。

IcedTea中看上去不错的一点是,它的 configure脚本使得在多种不同的模式下构建OpenJDK变得很容易,比如使用Zero Assembler Port在非x86/sparc芯片上来支持编译等等。

IcedTea提供的一大块内容是plugin/java-web-start基础架构。

由OracleJDK切换到OpenJDK

案例1

作者:知乎-朱端的一坨
正好之前由于Oracle对Java 8的政策调整,我们需要把所有服务器的jdk由sun jdk更换为open jdk,就遇到了几个问题,具体的原因记得不是特别清楚了,但是感觉挺切题的,就想提醒下,有些坑还挺深的,务必仔细测试一下:

  • ImageIO库里面,对jpg的处理上,通道支持的不完全一致,貌似sun的还可以支持阿法通道。然后导致我们切换后对一些图片的处理报错。
  • 内部的一个default toolkit库里面,mac上调用默认的实现的时候会有问题,但是Windows上没有问题。起因是我们很老的一个系统里面,通过字体库和图片的方式,来自己生成一个图形来实现button的展示(很奇怪的设计,不要问我为什么,我也想问),然后我发现我的mac上没有办法正常处理,会报错,但是同事的Windows上一切正常(内心是奔溃的)。

    案例二

    作者:知乎-繁星若尘
    换了openjdk后,请求部分https的网线,握手握不了,坑死了。。。。。

其他JDK

开源

按字母顺序列出的以下实现是开源的,可以免费使用:

  • AdoptOpenJDK
  • Amazon Corretto
  • Azul Zulu
  • Bck2Brwsr
  • CACAO
  • Codename One
  • DoppioJVM
  • Eclipse OpenJ9
  • GraalVM CE
  • HaikuVM
  • HotSpot
  • Jamiga
  • JamVM
  • Jelatine JVM
  • Jikes RVM (Jikes Research虚拟机)
  • JVM.go
  • leJOS
  • Maxine
  • Multi-OS Engine
  • RopeVM
  • uJVM

非开源

受版权保护的实现:

  • Azul Zing JVM
  • CEE-J
  • Excelsior JET
  • GraalVM EE
  • Imsys AB
  • JamaicaVM (aicas)
  • JBlend (Aplix)
  • MicroJvm (IS2T - 工业智能软件技术)
  • OJVM
  • PTC Perc
  • SAP JVM
  • Waratek CloudVM for Java

参考资料

https://blog.csdn.net/bisal/article/details/104832084/
https://www.zhihu.com/question/327162941/answer/700868255
https://blog.joda.org/2018/08/java-is-still-available-at-zero-cost.html
https://stackoverflow.com/questions/11547458/what-is-the-difference-between-jvm-jdk-jre-openjdk
https://adoptopenjdk.net/migration.html