Java语言无疑是现在最流行的编程语言之一,而且很可能不是”之一”,就是最流行的编程语言,虽然最新的情况是,Python 正在迎头赶上,也有统计说Python 已经领先Java一点。使用Java语言的开发人员是如此之多,但是大多数开发人员并没有意识到或者深入研究过JDK本身的差别问题。
很多人在初次接触Java时,甚至在使用Java一段时间后,也经常被JDK / JRE /JVM 这3个名词搞的头晕,能准确的说出三者的关系,应该算是Java入门了。
JDK(Java Development Kit) 是用于开发 Java 应用程序的软件开发工具,包括了 Java 运行时的环境(JRE)、解释器(Java)、编译器(Javac)、Java 归档(jar ——一种软件包文件格式)、文档生成器(Javadoc)等工具。
JRE(Java Runtime Environment) 提供 Java 应用程序执行时所需的环境,由 Java 虚拟机(JVM)、核心类、支持文件组成。
JVM(Java Virtual Machine)(Java 虚拟机)有三层含义,分别是:
ü JVM规范要求
JVM规范可以参考 https://docs.oracle.com/javase/specs/index.html
ü 满足 JVM 规范要求的一种具体实现(一种计算机程序)
ü 一个 JVM 运行实例,在命令提示符下编写 Java 命令以运行 Java 类时,都会创建一个 JVM 实例。
Java 程序运行时 JVM 是 JRE 的一个实例,也就是 runtime interpreter。它执行的是.class文件,它会将字节码翻译为平台可以执行的机器码。
JVM 是 Java 的核心。
JDK = JRE + 开发工具
JRE = JVM + 类库
Java程序的开发过程
ü 利用 JDK (调用 Java API)编写出 Java 源代码,存储于 .java 文件中
ü JDK 中的编译器 Javac 将 Java 源代码编译成 Java 字节码,存储于 .class 文件中
ü JRE 加载、验证、执行 Java 字节码
ü JVM 将字节码解析为机器码并映射到 CPU 指令集或 OS 的系统调用。
Oracle JDK由Oracle 公司完全开发,而OpenJDK由Oracle,OpenJDK和Java Community开发。然而,红帽,Azul Systems,IBM,Apple Inc.,SAP AG等顶级公司也积极参与其开发。
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。
Oracle JDK之前被称为SUN JDK,显而易见,这是在2009年Oracle收购SUN公司之前,收购后被命名为Oracle JDK。
OpenJDK和Oracle JDK的共同点
实际上,Oracle JDK是基于OpenJDK源代码构建的,因此Oracle JDK和OpenJDK之间没有重大的技术差异。
Oracle JDK与OpenJDK里的JVM都是HotSpot VM。从源码层面说,两者基本上是同一个东西。从JDK 7开始,Oracle JDK里的HotSpot VM,在研发的时候其实就是用放在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。
某次大会上,曾用下图证实了OpenJDK 7和Oracle JDK 7在程序上是非常接近的,两者共用了大量相同的代码,图中提示了两者共同代码的占比要远高于图形上看到的比例,所以OpenJDK基本上可以认为性能、功能和执行逻辑上都和官方的Oracle JDK是一致的。
ü 授权协议的不同:OpenJDK采用GPL V2协议放出,而Oracle JDK则采用JRL放出。两者协议虽然都是开放源代码的,但是在使用上的不同在于GPL V2允许在商业上使用,而JRL只允许个人研究使用。OpenJDK不包含Deployment(部署)功能:部署的功能包括:Browser Plugin、Java Web Start、以及Java控制面板,这些功能在OpenJDK中是找不到的。
ü 部分源代码用开源代码替换:由于产权的问题,很多产权不是SUN的源代码被替换成一些功能相同的开源代码,比如说字体栅格化引擎,使用Free Type代替。
ü OpenJDK只包含最精简的JDK:OpenJDK不包含其他的软件包,比如Rhino Java DB JAXP...,并且可以分离的软件包也都是尽量的分离,但是这大多数都是自由软件,你可以自己下载加入。
ü 不能使用Java商标:这个很容易理解,在安装OpenJDK的机器上,输入“java -version”显示的是OpenJDK。
命令行中使用java -version,可以看到JDK的版本,如果是Oracle JDK,会显示
[root@localhost ~]# java -version
java version "1.7.0_79"
Java(TM) SE Runtime Environment (build 1.7.0_79-b15)
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,会显示,
[root@localhost ~]# java -version
openjdk version "11-ea" 2018-09-25
OpenJDK Runtime Environment (build 11-ea+28)
OpenJDK 64-Bit Server VM (build 11-ea+28, mixed mode, sharing)
主要的Linux发行版(例如这些常见的Ubuntu、Fedora和Red Hat Enterprise Linux)提供OpenJDK或其变体作为系统默认的Java SE的实现,在这些Linux上安装JDK,默认安装的都是OpenJDK。
以下实现是开源的,可以免费使用:
ü 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
ü uJVM6.2
ü 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
看到这里,至少给大家一个印象,Java的世界里不只是Oracle JDK,但是如何选择合适的JDK呢 ? 下图给出了一些建议。
从上图可以看到,在 K1 Power 上可以使用 AdoptOpenJDK。
更多的最新的JDK ,JVM的知识,可以参考下面的链接
JVM ecosystem report 2020
https://snyk.io/blog/jvm-ecosystem-report-2020/
如Oracle 宣布的那样,在没有商业许可的情况下,在2019年1月之后发布的Oracle Java SE 8的公开更新将无法用于商业,商业或生产用途。但是,OpenJDK是完全开源的,可以自由使用。
随着OpenJDK的发展,以及出于商业政策的考虑,越来越多的企业和项目选择采用OpenJDK。
参考链接:
https://www.jianshu.com/p/7b99bd132470
https://www.zhihu.com/question/327162941
如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!
赞1
添加新评论0 条评论