Oracle JDK 是什么?最详细的介绍在这里 – wiki基地


深度解析 Oracle JDK:Java 开发者的核心利器与生态基石

Java 作为一种强大、灵活且应用广泛的编程语言,自问世以来,一直是企业级应用开发、移动应用(Android)、大数据、云计算等领域的主力军。而要进行 Java 开发或运行 Java 应用,最核心的基础便是 Java 开发工具包(JDK)。在众多 JDK 的实现与发行版本中,Oracle JDK 无疑是历史上最重要、最广为人知、也最常被提及的一个。

本文将对 Oracle JDK 进行一次深度、全面的解析,从它的起源、组成部分、核心特性、优势、发展历程,直至备受关注的许可模式、与 OpenJDK 的关系以及未来的走向,力求为读者呈现一个完整、详细的 Oracle JDK 图景。

一、 何谓 Oracle JDK?从 JDK 说起

在深入探讨 Oracle JDK 之前,我们首先要理解什么是 JDK。

JDK (Java Development Kit),中文名为 Java 开发工具包,是用于开发 Java 应用程序的软件开发环境。它是 Java 平台的核心组件,提供了 Java 程序从编写、编译、调试到运行所需的一切工具和库。简单来说,没有 JDK,你就无法进行 Java 开发。

JDK 主要包含以下几个核心部分:

  1. JRE (Java Runtime Environment):Java 运行时环境,是运行 Java 程序所必需的环境。它包含 Java 虚拟机(JVM)和 Java 类库(Java API)。如果只是运行已有的 Java 程序,安装 JRE 就足够了。
  2. JVM (Java Virtual Machine):Java 虚拟机,是 Java 平台的核心。它负责解释和执行 Java 字节码(.class 文件)。JVM 实现了 Java 的“一次编写,到处运行”(Write Once, Run Anywhere, WORA)的跨平台特性,因为不同的操作系统和硬件平台都有其对应的 JVM 实现。
  3. Java APIs (Java Application Programming Interfaces):Java 类库或标准库,是一系列预先编写好的 Java 类和接口的集合,提供了大量的常用功能,如字符串处理、集合框架、输入/输出、网络通信、图形界面等。开发者可以通过调用这些 API 来快速构建应用程序。
  4. 开发工具 (Development Tools):JDK 提供了一系列命令行工具,帮助开发者完成开发任务,例如:
    • javac:Java 编译器,将 Java 源代码(.java 文件)编译成 Java 字节码(.class 文件)。
    • java:Java 运行时启动器,用于启动 Java 应用程序或运行编译后的字节码。
    • jar:归档工具,用于将多个类文件和相关资源打包成 JAR (Java Archive) 文件。
    • javadoc:文档生成器,从 Java 源代码中的特定注释(Javadoc 注释)生成 API 文档。
    • jdb:Java 调试器。
    • jconsolejvisualvm:监控和性能分析工具。
    • jshell:交互式 Java Shell 工具(Java 9+)。
    • jlink:链接器,用于创建自定义的 Java 运行时镜像(Java 9+)。

Oracle JDK,顾名思义,是由 Oracle 公司发布的 JDK 版本。它是基于 OpenJDK 开源项目构建的,并且在历史上曾经包含一些 Oracle 独有的、闭源的增强功能(尽管在较新的版本中,这些增强功能大多已被贡献回 OpenJDK 或移除)。Oracle JDK 长期以来被认为是 Java 的“官方”实现,尤其是在商业和企业级应用领域。

二、 历史的足迹:从 Sun 到 Oracle

Java 语言和 JDK 最初由 Sun Microsystems 公司于 1995 年发布。Sun 公司在 Java 的早期发展中扮演了核心角色,推出了多个重要的 JDK 版本,奠定了 Java 在业界的地位。

2010 年,Oracle 公司收购了 Sun Microsystems,自此 Java 的所有权和主导权转移到了 Oracle 手中。Oracle 继承了 Sun 在 Java 方面的遗产,并继续投入巨资进行 Java 的研发和推广。Oracle JDK 成为了 Oracle 公司 Java 平台战略的核心产品之一。

在 Oracle 接手后,Java 和 JDK 的发展进入了一个新的阶段。Oracle 积极推动 Java 标准的演进,通过 Java 社区进程(JCP)发布新的 Java 版本(如 Java 7, 8, 9, 10, 11 等),并持续改进 Oracle JDK 的性能、稳定性和安全性。特别是 Java 8 的发布,带来了 Lambda 表达式、Stream API 等重要特性,对 Java 开发产生了深远影响。

随着 Java 9 引入模块化系统(Project Jigsaw)和 Java 10+ 引入的六个月快速发布周期,Oracle JDK 的发布模式和内部结构也发生了显著变化,以适应更快速的技术迭代和更灵活的应用部署需求。

三、 Oracle JDK 的核心组成部分详解

虽然前面简要列出了 JDK 的通用组成部分,但深入到 Oracle JDK 层面,我们可以更详细地了解其关键要素。

3.1 Java 虚拟机 (JVM) – HotSpot VM

Oracle JDK 使用的 JVM 实现是 HotSpot VM。HotSpot VM 是目前最先进、使用最广泛的 Java 虚拟机之一,其核心优势在于其高性能和稳定性。HotSpot 这个名字来源于其两大核心技术:

  1. 即时编译器 (JIT Compiler): HotSpot VM 包含多个即时编译器(如 C1 和 C2,以及较新的 Graal),它们能够在程序运行时将频繁执行的 Java 字节码(即“热点”代码)编译成本地机器码,从而显著提高程序的执行速度。这与传统的解释执行方式相比,是一个巨大的性能飞跃。HotSpot 的 JIT 编译器非常智能,能够进行各种复杂的优化,如方法内联、死代码消除、逃逸分析等,以生成高效的机器码。
  2. 自适应优化 (Adaptive Optimization): HotSpot VM 会在程序运行时收集性能数据,根据这些数据动态地调整优化策略。例如,它可以决定哪些方法是“热点”并进行编译,或者根据对象的生命周期选择不同的垃圾回收策略。

HotSpot VM 还内置了多种垃圾回收器 (Garbage Collector, GC),用于自动管理内存。不同的 GC 算法适用于不同的场景和需求:

  • Serial GC:最简单,使用单线程进行垃圾回收。适用于客户端模式,年轻代使用复制算法,老年代使用标记-整理算法。在进行垃圾回收时会暂停所有用户线程(Stop-The-World, STW)。
  • Parallel GC:吞吐量优先的 GC,使用多线程进行年轻代垃圾回收。老年代可以使用 Parallel Old GC (标记-整理)。它通过利用多核处理器的能力来缩短 STW 时间,但其主要目标是最大化吞吐量(即用户代码运行时间占总时间的比例)。
  • Concurrent Mark Sweep (CMS) GC:以获取最短回收停顿时间为目标的 GC,大部分工作与用户线程一起进行。适用于对停顿时间敏感的应用。但在 JDK 9 中已被标记为废弃,在后续版本中可能移除。
  • Garbage First (G1) GC:一种面向服务端的垃圾回收器,旨在平衡吞吐量和停顿时间。它将堆划分为多个区域,并尝试优先回收那些最多可回收空间(Garbage First)的区域。从 Java 9 开始,G1 成为 Oracle JDK 的默认垃圾回收器。
  • ZGCShenandoah GC:这两个是低延迟的 GC,旨在将 STW 时间控制在极低的水平(通常在毫秒甚至微秒级别),且停顿时间不随堆大小增长而显著增加。ZGC 是 Oracle 开发并包含在 Oracle JDK 和 OpenJDK 中的(从 Java 11 开始实验性,Java 15+ 正式)。Shenandoah 最初由 Red Hat 开发,也在 OpenJDK 中可用。它们代表了现代 GC 的前沿技术。

HotSpot VM 的这些高级特性,尤其是其优化的 JIT 编译器和多种可配置的 GC 选项,是 Oracle JDK 在性能和稳定性方面的重要支撑。

3.2 Java 运行时环境 (JRE)

如前所述,JRE 是运行 Java 程序所需的环境。Oracle JDK 包含了完整的 JRE,位于 JDK 安装目录下的 jre 子目录中(在较新的模块化版本中,JRE 的概念融入了 JDK,通过 jlink 可以构建最小化的运行时环境,但传统的 jre 目录可能不再独立存在或被显著简化)。JRE 包含 HotSpot VM 的一个实例以及核心 Java 类库。

3.3 Java API 和类库

Oracle JDK 提供了标准 Java 平台(Java SE)的所有 API 和类库。这些类库是按照功能和用途组织在不同的包(package)中,例如:

  • java.lang:核心类,如 Object, String, Thread, System, Math 等。无需导入即可使用。
  • java.util:各种工具类和集合框架,如 ArrayList, HashMap, Date, Random 等。
  • java.io:输入/输出流相关的类。
  • java.nio:新的非阻塞 I/O 类库。
  • java.net:网络通信相关的类,如 Socket。
  • java.sql:数据库访问(JDBC)相关的类。
  • java.awtjavax.swing:用于构建桌面图形用户界面(GUI)的类库。
  • java.security:安全相关的类和接口。
  • java.text:处理文本、日期、数字格式化的类。
  • java.time:现代日期和时间 API(Java 8+)。
  • java.util.concurrent:强大的并发编程工具集。

Oracle JDK 严格遵循 Java SE 规范,确保其提供的类库与规范一致,这保证了使用 Oracle JDK 开发的程序在符合规范的其他 JDK 实现上也能正确运行。

3.4 开发工具

Oracle JDK 包含前面提到的所有标准开发工具,并且随着 Java 版本的更新,这些工具的功能也在不断增强。

  • jshell:提供了一个 REPL (Read-Eval-Print Loop) 环境,方便开发者快速实验 Java 代码片段,特别适合学习和原型开发。
  • jlink:在 Java 9 引入,允许开发者根据应用程序的需要,创建只包含所需模块的自定义运行时镜像。这可以显著减小部署包的大小,特别适用于微服务和云环境。
  • 性能监控和分析工具(如 jcmd, jfr, jmc):Oracle JDK 提供了强大的工具来诊断和优化 Java 应用程序的性能。Java Flight Recorder (JFR) 是一个高性能的事件记录系统,可以收集 JVM 和应用程序的各种运行时数据;Java Mission Control (JMC) 是一个可视化工具,用于分析 JFR 记录的数据。虽然 JFR 和 JMC 最初是 Oracle 独有的,但在 Java 11 中已被开源,成为 OpenJDK 的一部分,但 Oracle 版本可能提供额外的支持或功能。

这些工具为 Java 开发者提供了从编码、编译、打包到运行、调试、监控和优化的全方位支持。

四、 Oracle JDK 的关键特性与优势

Oracle JDK 之所以能在 Java 生态系统中占据重要地位,得益于其自身的许多关键特性和优势:

  1. 高性能:基于高度优化的 HotSpot VM,Oracle JDK 在即时编译、垃圾回收等方面拥有业界领先的技术,能够为复杂的企业级应用提供卓越的运行时性能。
  2. 稳定性与可靠性:Oracle 作为一家大型企业级软件公司,其产品通常经过严格的测试和质量控制。Oracle JDK 被广泛部署在关键任务系统中,其稳定性和可靠性得到了验证。
  3. 安全性:Oracle JDK 持续接收安全更新和补丁,及时修复已知的安全漏洞。这对于部署在生产环境中的应用程序至关重要。
  4. 严格遵循标准:Oracle 是 Java SE 规范的主要贡献者和推动者,其 Oracle JDK 实现严格遵循最新的 Java SE 规范,保证了互操作性和兼容性。
  5. 完善的工具链:提供了一整套从开发到部署、监控的工具,提高了开发效率和运维能力。
  6. 企业级支持:对于购买了 Oracle Java SE Subscription 的企业用户,Oracle 提供专业的商业支持服务,包括技术咨询、故障排除、补丁和更新等。

五、 许可模式:一个重要的转折点

理解 Oracle JDK 的许可模式对于决定是否在商业环境中使用它至关重要。Oracle JDK 的许可模式在不同版本以及时间点上经历了几次重要的变化。

5.1 早期版本 (Java 8 Update 202 之前)

对于 Oracle JDK 8 的早期版本(例如 8u201 及之前)以及更老的版本(如 JDK 6, 7),其许可是基于 Binary Code License (BCL)。BCL 允许用户免费下载和使用 Oracle JDK 进行开发、测试、学习和个人用途。但是,如果需要在商业环境中部署应用程序时捆绑或使用 Oracle JDK,或者用于内部业务操作的生产系统,通常需要获得商业许可。这导致许多用户在开发时使用 Oracle JDK,但在生产环境切换到 OpenJDK 或其他免费的 JDK 版本。

5.2 Oracle JDK 8 的许可变化 (从 8u202 开始)

2019 年 1 月开始,Oracle 改变了对 Oracle JDK 8 的更新策略。对于 8u202 及之后的版本,Oracle JDK 8 的公共更新(Public Updates)不再免费提供给商业用户用于生产环境。如果商业用户想继续获取 Oracle JDK 8 的更新和支持,必须购买 Oracle Java SE Subscription(Java SE 订阅服务)。这使得 Oracle JDK 8 的后续更新在商业用途上变成了付费模式。

5.3 Java 11 及更高版本 的许可模式

从 Java 11 开始,Oracle 对 Oracle JDK 的许可模式进行了重大调整,采用了 Oracle Technology Network License Agreement for Java SE (OTNLA)。根据 OTNLA 许可协议,Oracle JDK 11 及更高版本:

  • 可以免费用于开发、测试、原型设计和演示。这意味着开发者可以在本地机器上、在 CI/CD 环境中免费使用最新版本的 Oracle JDK 进行日常开发和测试工作。
  • 用于生产用途、内部业务运营或其他商业或生产用途需要商业许可。如果你的应用程序部署在生产服务器上,为最终用户提供服务,或者你的内部工具依赖于 Oracle JDK 运行,你就需要购买 Oracle Java SE Subscription。

核心要点: Oracle JDK 11 及更高版本,对于开发和测试是免费的,但对于生产环境的商业使用是付费的。

这与许多 OpenJDK 构建(如 Adoptium/Temurin, Amazon Corretto, Azul Zulu OpenJDK 等)形成了鲜明对比,这些 OpenJDK 构建通常在 GNU 通用公共许可证(GPL)下发布,允许免费用于开发、测试和生产环境的商业使用

因此,在选择生产环境的 JDK 时,了解并遵守 Oracle JDK 的许可协议至关重要。不遵守许可协议可能会导致合规性问题。

六、 Oracle JDK 与 OpenJDK:关系与区别

理解 Oracle JDK 与 OpenJDK 的关系是避免混淆的关键。

OpenJDK 是 Java SE 平台的开源实现项目。它由 Oracle 主导,但有许多其他公司和个人贡献者参与,包括 Red Hat, Google, IBM, Azul 等。OpenJDK 的源代码在 GNU GPL v2 with Classpath Exception(允许商业软件链接到 OpenJDK 库而不受 GPL 传染)许可下发布,这意味着任何人都可以免费使用、修改和分发 OpenJDK 的源代码或构建版本,用于任何目的(包括商业生产环境)。

Oracle JDK 是 Oracle 公司基于 OpenJDK 项目的源代码构建并发布的 JDK 版本。

历史区别 (主要指 Java 11 之前):

  • 在 Java 11 之前,Oracle JDK 基于 OpenJDK 代码库构建,并额外包含了一些 Oracle 独有的、闭源的组件。这些组件曾经包括:
    • 一部分图形渲染代码。
    • Java Flight Recorder (JFR) 和 Java Mission Control (JMC)(性能分析工具)。
    • 部分垃圾回收器(如曾经的商业特性 GC)。
    • JavaFX(在 JDK 11 后从 Oracle JDK 中移除,成为独立的 OpenJFX 项目)。
  • 这些独有组件使得当时的 Oracle JDK 在某些方面(如性能分析工具、一些优化细节)与纯粹的 OpenJDK 构建有所不同。

当前区别 (Java 11 及更高版本):

  • 从 Java 11 开始,Oracle 已经将绝大多数之前 Oracle JDK 独有的特性开源并贡献回 OpenJDK 主线。例如,JFR 和 JMC 现在是 OpenJDK 的一部分。之前某些商业特性的 GC 也已开源。
  • 这意味着,自 Java 11 起,Oracle JDK 的构建与 OpenJDK 的参考实现(由 Oracle 构建并发布到 jdk.java.net 的那些版本)在技术特性上几乎是相同的。主要的区别不再是功能上的显著差异,而是:
    • 许可协议:如前所述,Oracle JDK 的 OTNLA 许可要求商业生产用途付费,而 OpenJDK 构建(如 Adoptium/Temurin, Corretto 等)通常是 GPL 许可,免费用于所有用途。
    • 品牌和签名:Oracle JDK 构建包含 Oracle 的品牌信息和数字签名。
    • 更新和支持模式:Oracle JDK 提供付费的商业支持和长期维护(LTS)更新,而 OpenJDK 构建的更新和支持由其各自的提供商(如 Red Hat, Azul, Adoptium 社区等)提供。
    • 构建过程和测试:不同的提供商可能有不同的构建过程和测试套件,但这通常不会导致显著的功能差异,而更多影响的是稳定性和兼容性保障。

总结来说: Oracle JDK 是 Oracle 公司对 OpenJDK 项目的商业化构建和分发版本。在 Java 11+ 时代,其与纯 OpenJDK 构建的核心技术差异已非常小,主要区别在于许可协议、支持模式和品牌。对于大多数不希望支付商业许可费用的生产环境用户,选择一个可靠的 OpenJDK 构建版本(如 Adoptium 的 Temurin, Amazon Corretto, Azul Zulu OpenJDK, Red Hat OpenJDK 等)是更常见的做法。

七、 如何获取和安装 Oracle JDK

获取 Oracle JDK 需要访问 Oracle 官方网站。

  1. 访问 Oracle Technology Network (OTN) 的 Java SE 下载页面。
  2. 根据你需要的 Java 版本(例如 Java 17, Java 21 等)找到对应的下载链接。
  3. 选择适合你操作系统的安装包(Windows x64 Installer, macOS Installer/Archive, Linux x64 RPM/Debian/Compressed Archive 等)。
  4. 下载安装包。请注意,通常需要接受 Oracle 的许可协议并登录 Oracle 账户才能下载较新的版本。
  5. 运行安装程序或解压压缩包进行安装。
  6. 配置环境变量 (可选但推荐):
    • 设置 JAVA_HOME 环境变量指向你的 JDK 安装目录的根路径。
    • %JAVA_HOME%\bin (Windows) 或 $JAVA_HOME/bin (Linux/macOS) 添加到系统的 PATH 环境变量中,这样就可以在命令行中直接使用 java, javac 等命令。
  7. 验证安装: 打开命令行终端,运行 java -versionjavac -version 命令,检查输出的版本信息是否与你安装的 Oracle JDK 版本一致。

请务必从官方渠道下载 Oracle JDK,以确保下载的软件包没有被篡改,并且能够获得最新的安全更新。

八、 Oracle JDK 的使用场景与目标用户

尽管许可模式有所变化,Oracle JDK 仍然是某些特定场景和用户群体的首选:

  • 需要 Oracle 官方商业支持的企业: 对于大型企业或运行关键任务系统的组织,Oracle Java SE Subscription 提供的官方技术支持和维护服务是重要的保障。
  • 需要长期稳定维护和可预测更新路径的用户: Oracle 为其 LTS (Long-Term Support) 版本(如 Java 11, 17, 21)提供多年的更新和支持,这对于需要长期稳定运行的应用非常有吸引力。
  • 历史上长期使用 Oracle JDK 的用户: 许多遗留系统构建在 Oracle JDK 上,为了保持兼容性或出于习惯,会倾向于继续使用 Oracle JDK。
  • 需要 Oracle 独有工具(历史原因或特定版本)的用户: 虽然现在多数工具已开源,但在某些旧版本或特定需求下,用户可能仍依赖 Oracle JDK 提供的某些功能或工具。
  • 开发者进行开发和测试: 根据 OTNLA 许可,开发和测试用途是免费的,因此开发者可以放心地在本地开发环境中使用最新或特定版本的 Oracle JDK。

九、 Oracle JDK 在 Java 生态系统中的作用

Oracle JDK 不仅仅是一个 JDK 实现,它在整个 Java 生态系统中扮演着基石和引领者的角色:

  • 标准制定者: Oracle 通过主导 Java 社区进程(JCP),积极推动 Java SE 标准的演进和新特性的加入。Oracle JDK 往往是这些新特性的首批实现者之一。
  • 参考实现: Oracle JDK(以及 OpenJDK 的参考构建)通常被视为 Java SE 规范的参考实现,其他 JDK 实现会以它为基准进行兼容性测试。
  • 技术创新源泉: Oracle 在 JVM 技术(如 HotSpot VM, ZGC)和 Java 类库方面持续投入研发,许多先进的技术首先在 Oracle JDK 中得到实现,最终可能被贡献回 OpenJDK,惠及整个社区。
  • 商业生态推动者: 通过提供商业订阅和支持,Oracle 建立了围绕 Java 的商业生态,为企业的关键应用提供了可靠的运行和维护基础。

十、 未来展望

Oracle JDK 的未来发展将继续与 OpenJDK 项目紧密绑定。随着 Oracle 将越来越多的特性贡献回 OpenJDK,Oracle JDK 与 OpenJDK 构建之间的技术差异将越来越小。未来的竞争和选择更多地体现在:

  • 许可和支持模式: 用户将根据其对商业支持的需求和成本考虑,在 Oracle JDK 的付费订阅与其他提供商的免费或付费 OpenJDK 构建之间做出选择。
  • 特定提供商的增值服务: 各个 OpenJDK 提供商可能会在其构建版本中加入特定的优化、工具或服务,形成差异化竞争。
  • 新特性的采纳速度: 尽管 OpenJDK 是主线,但不同提供商发布其基于最新 OpenJDK 的构建版本的时间和质量可能有所差异。

Oracle 将继续在 Java SE 的核心研发、标准制定和企业级支持方面发挥关键作用。Oracle JDK 将继续作为 Oracle Java 战略的重要组成部分,服务于需要官方支持和长期维护的企业用户。

十一、 总结

Oracle JDK 是 Oracle 公司发布的一款强大的 Java 开发工具包,它是基于 OpenJDK 开源项目构建的,并长期以来被视为 Java 的官方实现。它包含高性能的 HotSpot JVM、完整的 Java 类库以及一套丰富的开发工具,为 Java 应用程序的开发、部署和运行提供了坚实的基础。

理解 Oracle JDK 最关键的一点在于其许可模式的演变:在 Java 11 及更高版本中,Oracle JDK 免费用于开发和测试,但商业生产用途需要购买 Oracle Java SE Subscription。这与许多免费可用于生产环境的 OpenJDK 构建(如 Adoptium Temurin, Amazon Corretto 等)形成了重要的区别。

尽管许可模式带来了选择的复杂性,Oracle JDK 凭借其卓越的性能、稳定性、安全性和完善的工具链,以及 Oracle 提供的企业级支持,在特定的使用场景和用户群体中仍然具有不可替代的价值。它不仅是一个强大的开发工具,更是 Java 平台发展史上的重要组成部分,持续影响和推动着整个 Java 生态系统的进步。

对于 Java 开发者和企业用户而言,了解 Oracle JDK 的详细信息、其与 OpenJDK 的关系以及最新的许可政策,是做出明智的 JDK 选择、确保合规性和优化应用程序性能的关键。


发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部