jdk和java什么区别 Java领域概念JDK(1)

JVM

JVM 全称 Java Virtual Mechinal,即 Java 虚拟机。JVM 是驻留于内存中的抽象计算机,可以理解为一个虚拟的计算机,它是通过在真实计算机上仿真模拟各种计算机功能来实现的,具有处理器、堆栈、寄存器等完善的硬件架构以及相应的指令系统,通过抽象 CPU 和操作系统结构,使代码的执行与主机硬件、主机操作系统无关。

JVM 关注的是 Java 字节码文件(类文件 .class),Java 字节码文件由 JVM 指令集、符号表以及一些补充信息组成。JVM 的主要工作是将 Java 字节码解释为本地机器码,实际就是将自己的指令集(Java 字节码)映射为本地 CPU 的指令集或操作系统的接口调用(本地机器码)。

Java 语言的跨平台性,其实就是靠不同平台版本的 JVM 来实现的。不同的操作系统,使用不同的 JVM 映射规则,使 Java 字节码的解释执行与操作系统无关,从而完成跨平台(一次编译,到处执行)。也就是说,能跨平台的是 Java 程序,而 JVM 是不能跨平台的,对于不同的操作系统平台有不同的 JVM 实现,Java 程序的跨平台性就是通过 JVM 的跨平台实现的。

JVM 主要包含了以下组件:

JVM 除了跨平台意义上的不同实现之外,还有很多不同的发行版,每个发行版通常都会有不同平台的实现。这些不同的发行版往往会有不同的特性,或针对不同的领域。

上述 JVM 主要是在 JSE / JEE 领域的主流选择,而针对 JME 领域及 Android 或 Android 兼容系统也有诸如 CLDC-HI、JavaCard、Sun SPOT、OpenJ9(OpenJ9 是一个高度模块化的 JVM,在嵌入式、JME 领域都可以应对)等实现。此外还有一些研究性质的 JVM,如 Graal VM、Jikes RVM、Maxine VM 等。

JRE

JRE 全称 Java Runtime Environment,即 Java 运行时环境,由运行和管理 Java 应用程序的类库和工具组成。

JRE 中包含了 JVM,单纯的 JVM 不能运行 Java 程序,JVM 在解释 Java 字节码时需要用到一些核心类库,这些核心类库就被包含在 JRE 中,简单来说 JRE 就是 JVM 核心类库。

除了 JVM 和 核心类库之外,通常的 JRE 发行版中还会包含一些其它的工具和命令,如 密钥库工具 keytool、安全策略管理工具 policytool、jar 文件解压缩工具 pack200/unpack200 等。

JDK

JDK 全称 Java Development Kit,即 Java 开发工具包,是面向 Java 开发人员使用的 SDK(Software Development Kit,软件开发工具包),提供了 Java 程序的开发环境和运行环境。

JDK 包含了 JRE、基础类库(Java API,如网络、IO、线程、图形等)、Java 源码编译器 javac、以及其它的一系列用于开发、诊断、分析、调试、管理的工具和命令,如 jar、javah、native2ascii、jdb、jconsole、jstat、jps、jmap、jhat 等。

从 Java 11 开始,安装 JDK 时不会直接安装 JRE,需要用户自行选择安装 JRE 模块,可以使用 jlink 程序生成,如:bin\jlink.exe --module-path jmods --add-modules java.desktop --output jre 。

JDK 有多个构建版本,而实际只有一组源代码,即 OpenJDK,使用分布式版本控制系统 Mercurial 托管在 OpenJDK。任何人都可以获取这些源码,并用其构建一个变种版本进行发布。当然需要一个独有的认证程序来确保构建的变种版本是有效的,这个认证程序是由 JCP(Java Community Process)组织审核的,该组织会提供一套技术兼容性工具包 TCK(Technology Conformance Kit)。如果你构建了一个 OpenJDK 的变种版本,并通过了 TCK 的兼容性测试,则可以将该变种版本称为“Java SE Compatible”(兼容 Java SE 的 JDK)。

下面是一些主流的 OpenJDK 构建版本——

  • Oracle JDK:就是之前的 Sun JDK,被 Oracle 收购后命名为 Oracle JDK,由 Oracle 的团队维护。从 Java 11 开始提供付费的商业支持,当然个人或非商业用途仍然可以享受免费支持。但现阶段还没有单独针对 Oracle JDK 的付费策略,基本是和 Oracle 的其它商业产品绑定,Oracle 计划在 2026 年后提供全额付费的服务支持。
  • Oracle OpenJDK:免费的 OpenJDK 版本,基于 GPL 协议开源,允许直接用于商业环境。Oracle 提交的源代码衍生出 Oracle JDK 和 Oracle OpenJDK 不同的编译版本,从 Java 11 开始,两者的特性差异已经最小化,差异部分大多是 Oracle 的商业特性。但 Oracle OpenJDK 大版本发布后,Oracle 对其最多会有两次安全补丁的升级(发布后的六个月内),之后不再负责该大版本维护,如果用户想持续获得安全升级,需要及时更新到新的大版本。由于 Oracle OpenJDK 是开源的,因此可以直接基于源码编译出社区版 JDK,甚至可以加入自定义特性并商业化。
  • 值得一提的是,在安全补丁级别相同的情况下,Oracle JDK 并不比 OpenJDK 更好。如果不需要商业支持或企业管理工具,可以选择使用 Oracle OpenJDK 构建版本。
  • AdoptOpenJDK:一个由社区驱动的项目,基于 GPL 开源协议,以免费软件的形式提供社区版 OpenJDK 二进制包,与 Oracle OpenJDK 不同的是,该发行版会长期提供安全及其它补丁的更新,和 Java 11 一样,至少提供 4 年的免费长期支持(LTS)计划。IBM 和 Red Hat 也曾表示提供相关安全补丁。
  • AdoptOpenJDK OpenJ9:除了标准的 OpenJDK 构建外,AdoptOpenJDK 还提供了使用 OpenJ9 VM 的版本。OpenJ9 是最初由 IBM 实现的 JVM,现在由 Eclipse 基金会 运作,并在 GitHub 上开源。。
  • Red Hat OpenJDK:这是 Red Hat 提供的一个 OpenJDK 构建版本,提供商业付费支持,它通常被集成在 Red Hat 的操作系统中(RHEL, Red Hat Enterprise Linux)。
  • Azul Zulu:一个 OpenJDK 的免费版本,同时也提供商业付费支持。
  • IBM JDK:IBM 为 Java 8 及更早版本提供支持,另外 IBM 还为 AdoptOpenJDK OpenJ9 版本提供商业付费支持。

除了上面所述之外,还有其它很多不同的构建版本,如阿里巴巴的 Dragonwell,AWS 的 Corretto 等,此外不同的 Linux 发行版也会使用不同的方式内置 OpenJDK,如 Ubuntu、Debian、Fedora、Arch 等,而如果要追求“标准”,最好的建议是使用 Oracle OpenJDK、AdoptOpenJDk 以及 Linux 发行版中内置的构建版本。

参考

  • https://hllvm-group.iteye.com/group/topic/17147
  • https://www.oschina.net/news/99836/time-to-look-beyond-oracles-jdk

,