必知必会:关于 OpenJDK 的一切 – wiki基地


必知必會:關於 OpenJDK 的一切

在當今軟體開發領域,Java 語言無疑扮演著舉足輕重的角色。從企業級後端服務、Android 應用程式、大數據處理到雲原生應用,Java 無處不在。而支撐著 Java 運行的核心,正是 Java Development Kit (JDK)。對於廣大 Java 開發者、系統管理員乃至技術愛好者而言,理解 JDK 的基礎——特別是 OpenJDK——是 mastering Java 的必經之路。

本文將帶您深入了解 OpenJDK 的方方面面,從其誕生、發展、核心組成,到它與其他 JDK 版本(尤其是 Oracle JDK)的關係,以及它在現代 Java 生態系統中的重要性。無論您是剛接觸 Java 的新手,還是經驗豐富的資深開發者,這篇文章都將提供您關於 OpenJDK 必須知道和理解的關鍵知識。

第一章:OpenJDK 是什麼?基石與核心

要理解 OpenJDK,我們首先要明確它的定義。

OpenJDK 是 Java Standard Edition (Java SE) 平台規範的自由、開源實現。

簡單來說,Java 語言本身是由一套規範(Specification)來定義的,這套規範詳細描述了 Java 語言的語法、語義、標準類庫的行為、Java 虛擬機(JVM)的結構和指令集等等。任何符合這套規範的實現都可以被稱作一個 Java SE 的實現。

OpenJDK 就是 Java SE 規範的官方參考實現。這意味著它是 Java SE 標準化過程中的一個核心產物,是其他許多 JDK 版本賴以建立的基礎。它由開源社區和主要參與公司(如 Oracle、Red Hat、Azul Systems、SAP、IBM 等)共同開發和維護。

關鍵點:

  • 自由與開源: OpenJDK 遵循 GPLv2 許可證,並帶有 Classpath Exception。這意味著您可以免費下載、使用、修改和分發它,而不需要支付任何許可費用。Classpath Exception 允許您在基於 OpenJDK 運行或開發的應用程式中使用標準類庫,而無需將您的應用程式也開源。
  • 參考實現: 它是 Java SE 規範的主要實現,新的語言特性和 API 通常首先在 OpenJDK 中實現。
  • 社區驅動: 雖然 Oracle 是主要的貢獻者,但 OpenJDK 項目是一個開放的社區,任何人都可以根據貢獻指南參與開發、提交 Bug 修復、測試和參與討論。

OpenJDK 項目本身並不直接提供「發行版」(ready-to-use binaries)給終端用戶使用。它提供的是原始碼。各種公司和組織(包括 Oracle 自己)基於 OpenJDK 的原始碼進行構建、測試,然後作為特定的 JDK 發行版發布。這就是為什麼您會看到諸如 Oracle OpenJDK、Adoptium (Temurin)、Azul Zulu、Amazon Corretto、SapMachine 等多個 JDK 版本,它們都源於 OpenJDK 的原始碼。

第二章:OpenJDK 的歷史:從封閉到開放

OpenJDK 的誕生是 Java 歷史上一個重要的里程碑,標誌著 Java 從一個主要由 Sun Microsystems 控制的閉源技術轉變為一個更加開放的生態系統。

  • Sun Microsystems 時代 (創立到 2006/2007): Java 語言由 Sun Microsystems 於1995年推出。在很長一段時間內,Sun 的 JDK 是唯一的官方實現,並且是閉源的。這限制了社區的參與和創新速度,也引發了對 Java 所有權和控制權的擔憂。
  • 走向開源 (2006/2007): 在經歷了關於開源 Java 的長期討論和努力後,Sun Microsystems 最終決定將其大部分 Java SE 實現開源。2006年底,Sun 發布了 HotSpot JVM 的部分原始碼;2007年,大部分 Java SE 類庫原始碼也在 GPLv2 許可下開源,正式啟動了 OpenJDK 項目。這一舉動旨在加速 Java 的發展,吸引更廣泛的開發者參與,並確保 Java 作為一個開放的平台。
  • Oracle 收購 Sun (2010): Oracle 收購了 Sun Microsystems,這讓 Oracle 成為了 Java 技術和 OpenJDK 項目的主要管理者和貢獻者。儘管最初有人擔心 Oracle 會如何處理 OpenJDK,但事實證明,Oracle 繼續大力投資 OpenJDK 的開發,並在其中扮演著核心角色。
  • 發展與演進: 在 Oracle 的領導和社區的共同努力下,OpenJDK 持續快速發展,引入了許多重要的語言特性和性能改進。尤其是在 Java 9 之後,Java 引入了模組化系統(Project Jigsaw),並採納了新的發布週期:每六個月發布一個新版本,每三年發布一個長期支持(LTS)版本。OpenJ D K 成為了實現這些新特性的主要平台。

OpenJ D K 的歷史是一個關於技術開放、社區協作和持續創新的故事。它證明了即使是像 Java 這樣複雜和成熟的技術,也能通過開源模式獲得新的生命力。

第三章:OpenJDK vs. Oracle JDK:剪不斷理還亂的關係

這可能是關於 OpenJDK 最常見的問題之一:它與 Oracle JDK 有什麼區別?過去,這個問題的答案比較複雜,但隨著時間推移,兩者的關係變得越來越清晰(也更為接近)。

歷史上的差異 (Java 8 及以前):

  • 原始碼: Oracle JDK 是基於當時的 OpenJDK 原始碼構建的,但 Oracle 會在其基礎上添加一些專有組件。
  • 專有組件: Oracle JDK 曾包含一些 OpenJDK 中沒有的專有或閉源特性,例如:
    • 一些特定的垃圾收集器(如 Oracle 的 Commercial Features 中的某些進階 GC)。
    • Java Flight Recorder (JFR) 和 Java Mission Control (JMC)(這些工具在後來的 OpenJDK 版本中已經開源並包含進來)。
    • 更好的字體渲染。
    • 一些特定的性能優化。
  • 許可證: Oracle JDK 的許可是基於 Oracle 二進制代碼許可協議(Oracle Binary Code License Agreement),免費使用通常有限制(例如開發和測試環境),生產環境或某些特定用途需要付費許可。而 OpenJDK 始終是 GPLv2 + Classpath Exception。
  • 更新和支持: Oracle 為其 Oracle JDK 提供了更長時間的商業支持和更新,包括一些安全補丁和 Bug 修復,這些更新可能不會立即或永遠同步到 OpenJDK 的公共版本中(至少在當時是這樣)。

現代的差異 (Java 11 及以後):

Oracle 在 Java 11 版本後,顯著改變了其 JDK 的發布和許可策略:

  • Oracle JDK 的許可: Oracle JDK 從 Java 11 開始,其許可證變為 Oracle No-Fee Terms and Conditions (NFTC) 許可。這個許可證允許用戶在開發和生產環境中免費使用 Oracle JDK,但更新頻率較快(每六個月一個版本,只有最新的幾個非 LTS 版本和當前 LTS 版本獲得免費更新),且長期商業支持需要付費訂閱。Oracle 也在同時提供基於經典商業許可的付費 JDK 版本,提供更長的更新和支持週期以及可能的專有工具。
  • OpenJ D K 的 Oracle 發行版: Oracle 自己也開始提供基於 OpenJDK 原始碼構建的 OpenJDK 發行版。這些版本是完全開源和免費的,與 Oracle JDK 使用相同的構建過程和程式碼庫,只是不包含任何潛在的專有特性(儘管現在 Oracle JDK 的專有特性已經很少了)。這些版本通常只提供半年左右的更新。
  • 特性差異縮小: 許多以前僅在 Oracle JDK 中可用的專有特性(如 JFR 和 ZGC 等)已經在 OpenJDK 中開源並包含了進來。現代的 OpenJDK 和 Oracle JDK 在核心功能和性能上已經非常接近。
  • 原始碼的一致性: 現在可以說,Oracle JDK 就是基於 OpenJDK 主線原始碼構建的一個發行版。Oracle 的工程師是 OpenJDK 項目最主要的貢獻者。

總結:

  • OpenJDK 是 Java SE 規範的官方參考實現,是一個開源項目,提供原始碼
  • Oracle JDK 是基於 OpenJDK 原始碼構建的一個發行版,由 Oracle 提供。
  • 在 Java 11+ 時代,Oracle JDK 的免費版本和 Oracle 提供的 OpenJDK 版本在核心功能上非常接近,最大的區別在於許可證條款、更新頻率、支持模式以及是否包含極少數的潛在專有增強(這些增強越來越少見)。
  • 許多其他公司和組織也提供基於 OpenJDK 原始碼構建的發行版(如 Adoptium、Azul Zulu 等),這些是完全免費且通常提供長期支持的優質選擇。

對於大多數開發者和組織而言,使用基於 OpenJDK 構建的免費發行版(包括 Oracle 提供的 OpenJDK 或其他供應商的發行版)是完全可行且推薦的選擇,它們提供了完整的 Java SE 功能,並且無需支付許可費用。選擇哪個發行版更多取決於您對支持、更新週期、供應商聲譽和額外工具/服務的需求。

第四章:OpenJDK 的核心組成部分

OpenJDK 項目是一個龐大的軟體集合,包含了運行和開發 Java 應用程式所需的一切。其主要組成部分包括:

  1. HotSpot Virtual Machine (JVM):

    • 這是 OpenJDK 的心臟,負責執行 Java 字節碼。
    • HotSpot JVM 是高性能的代表,得名於其能夠識別並優化程式中「熱點」(Hot Spots),即頻繁執行的程式碼。
    • 主要功能:
      • 字節碼解釋器 (Interpreter): 逐條執行字節碼指令。
      • 即時編譯器 (Just-In-Time Compiler, JIT): 將頻繁執行的 Java 字節碼編譯成本地機器碼,以提高執行效率。HotSpot 包含 C1(Client Compiler)和 C2(Server Compiler)等多個 JIT 編譯器。
      • 垃圾收集器 (Garbage Collector, GC): 自動管理內存,回收不再使用的對象佔用的空間。OpenJDK 提供了多種 GC 實現,以適應不同應用場景和性能需求,例如:
        • Serial GC (串行 GC)
        • Parallel GC (並行 GC)
        • CMS GC (Concurrent Mark Sweep GC – 已廢棄)
        • G1 GC (Garbage First GC – 默認 GC,特別適用於大堆內存)
        • ZGC (Z Garbage Collector) 和 Shenandoah GC (高吞吐量、低延遲的並行 GC) – 這些是較新的、先進的 GC 選項,旨在提供非常低的停頓時間。
      • 執行引擎 (Execution Engine): 協調解釋器、JIT 和 GC 的工作。
      • 執行時數據區 (Runtime Data Areas): 包括堆 (Heap)、方法區 (Method Area)、Java 虛擬機棧 (JVM Stacks)、本地方法棧 (Native Method Stacks)、程式計數器 (PC Register)。
    • HotSpot JVM 是 OpenJDK 中最複雜和經過高度優化的部分之一。
  2. Java Class Libraries (Standard Libraries):

    • 這是一組龐大的預寫好的類和接口,提供了 Java 開發者使用的標準 API。它們構成了 Java SE 平台的核心功能。
    • 主要功能/包含的包:
      • 基礎類:java.lang (Object, String, Thread, etc.)
      • 集合框架:java.util (List, Set, Map, Collections, etc.)
      • I/O 和文件操作:java.io, java.nio
      • 網路:java.net
      • 並發處理:java.util.concurrent
      • 數據庫連接:java.sql
      • 日期和時間:java.time (Java 8 引入)
      • XML 處理:java.xml
      • 安全性:java.security, javax.net.ssl
      • 圖形使用者界面 (GUI):java.awt, javax.swing (注意 JavaFX 已從 JDK 中移除,獨立發布)
      • 以及許多其他領域的 API。
    • 這些類庫是 OpenJDK 原始碼的重要組成部分,它們與 JVM 協同工作,提供完整的 Java 運行環境。
  3. Java Compiler (javac):

    • 將 Java 原始碼(.java 文件)編譯成 Java 字節碼(.class 文件)。
    • 它是 JDK 中的一個重要工具,是開發流程的必備環節。
  4. 其他工具 (Developer Tools):

    • OpenJDK 包含一系列用於開發、調試、監控和部署 Java 應用程式的命令行工具。
    • 常見工具包括:
      • java: 執行 Java 應用程式。
      • jar: 打包 Java 類和資源到 JAR 文件。
      • javadoc: 生成 API 文檔。
      • jdb: Java 調試器。
      • jconsole, jvisualvm: 圖形化監控和管理工具。
      • jps: 列出運行中的 HotSpot JVM 進程。
      • jstat: 監控 JVM 統計信息。
      • jlink: 鏈接模組化應用程式及其所需的運行環境,生成自包含的運行時鏡像(Java 9+)。
      • jshell: 交互式 Java 語句評估工具(Java 9+)。
  5. Native Code / Operating System Interfaces:

    • OpenJDK 的許多部分(尤其是 JVM)是用 C/C++ 編寫的,以便與底層作業系統和硬體交互。
    • 它包含了不同平台(Windows, Linux, macOS, 等)的本地實現和接口,以確保 Java 應用程式的跨平台能力。

所有這些組件的原始碼都托管在 OpenJDK 項目中,供社區檢視、修改和構建。它們共同構成了一個完整、功能強大的 Java 開發和運行環境。

第五章:OpenJDK 的開發模式與治理

OpenJDK 的成功離不開其開放的開發模式和清晰的治理結構。

  • Open Community: OpenJDK 項目是一個真正的開源社區。任何人都可以註冊成為一個參與者,提交 Bug 報告、參與郵件列表討論、貢獻程式碼(經過同行評審後可能會被接受)。
  • OpenJDK Projects: OpenJDK 項目內部又分為許多子項目(Projects),每個子項目負責特定的領域,例如:
    • JDK Project: 主線 JDK 的開發。
    • HotSpot Project: JVM 的開發。
    • Graphics Project: 圖形相關 API 的開發。
    • Networking Project: 網路 API 的開發。
    • …還有許多其他項目負責新特性(如 Loom, Valhalla, Panama 等)的孵化和實現。
  • JDK Enhancement Proposals (JEPs): 新的語言特性、API 變更或重大內部改進通常以 JEP 的形式提出。JEP 是一個詳細的提案,描述了改進的目標、實現細節、測試方案等。JEP 需要經過社區討論和審查過程,最終由相關的 Project Lead 或 OpenJDK Governing Board 批准才能進入實現階段。JEP 是 OpenJDK 持續創新的重要機制。
  • Role of Oracle: 雖然是社區項目,但 Oracle 在 OpenJDK 中扮演著核心角色。Oracle 僱傭了大量全職的 Java 工程師,他們是 OpenJDK 最主要的貢獻者,負責大部分核心程式碼的開發、維護和 JEP 的實現。Oracle 同時也負責 OpenJDK 的基礎設施(如原始碼倉庫、構建系統、郵件列表等)的維護。
  • Role of Other Companies and Individuals: 除了 Oracle,許多其他公司(如 Red Hat、Azul Systems、SAP、IBM、Google 等)也投入了大量的工程資源貢獻給 OpenJDK。這些貢獻涵蓋 Bug 修復、性能優化、移植到新平台、開發新特性等。個人開發者也可以貢獻。
  • Governing Board: OpenJDK 項目有一個治理委員會(Governing Board),負責監督項目的整體健康狀況、解決爭議、批准重要的決策(如新的子項目、重要的策略變更等)。委員會成員來自不同的貢獻者組織,以確保決策的公正性和代表性。

這種開放、協作、基於流程(JEP)的開發模式,加上多個主要利益相關者的參與,是 OpenJDK 得以快速發展和保持活力的關鍵。

第六章:為什麼 OpenJDK 如此重要?

OpenJDK 不僅僅是 Java 的一個實現,它在整個 Java 生態系統中具有極其重要的意義:

  1. Java SE 規範的基礎: 作為參考實現,OpenJDK 是定義和推進 Java SE 標準的載體。新的 Java 版本首先在 OpenJDK 中實現和測試,然後這些實現成為驗證規範正確性和可行性的依據。
  2. 確保 Java 的開放性: OpenJDK 的存在保證了 Java 不會被任何單一公司完全控制。GPLv2 + Classpath Exception 許可證確保了任何人都可以免費使用和實現 Java 技術,避免了潛在的供應商鎖定(Vendor Lock-in)。
  3. 促進創新: 開放的開發模式和 JEP 機制吸引了來自全球的開發者和研究人員參與,加速了新特性、性能改進和平台移植的出現。許多前沿的 JVM 技術(如 ZGC、Shenandoah、Loom 等)都是在 OpenJDK 中孵化和成熟的。
  4. 性能與穩定性: 由於來自不同組織和個人的廣泛參與,OpenJDK 經過了大量的測試、優化和 Bug 修復。其性能和穩定性已經達到了企業級標準,許多全球頂級公司都在生產環境中大規模使用基於 OpenJDK 的發行版。
  5. 豐富的生態系統: OpenJDK 作為基石,催生了眾多基於其原始碼的第三方 JDK 發行版。這些發行版提供了不同的支持模式、優化、安全更新策略或特定平台的移植,為用戶提供了豐富的選擇,滿足了各種不同的需求。
  6. 跨平台能力: OpenJDK 積極支持和維護在各種操作系統和硬體架構上的移植(Ports),包括 x86/x64, ARM, SPARC, PowerPC, s390x 等,確保了 Java 的跨平台優勢。

可以說,沒有 OpenJDK,現代 Java 生態系統的面貌將截然不同。它是 Java 技術能夠在變化迅速的 IT 環境中保持競爭力和活力的核心要素。

第七章:如何獲取和使用 OpenJDK 發行版

正如前面提到的,OpenJDK 項目本身主要提供原始碼。我們日常使用的「JDK」通常是基於 OpenJDK 原始碼構建的特定發行版。市面上有許多不同的 OpenJDK 發行版可供選擇,它們都符合 Java SE 標準,但在構建、測試、更新策略和支持方面可能有所不同。

主流的 OpenJDK 發行版提供商包括:

  1. Oracle OpenJDK Builds: Oracle 自己提供的基於 OpenJDK 原始碼構建的免費版本。可以在 jdk.java.net 下載。這些版本通常只提供短期更新。
  2. Adoptium (formerly AdoptOpenJDK) – Temurin: 這是由 Eclipse Adoptium 工作組維護的流行發行版,提供了由 Eclipse 基礎設施構建和測試的 OpenJDK 版本 (Temurin)。它們提供廣泛的版本支持和穩定的構建。可以在 adoptium.net 下載。這是許多開發者推薦的免費選擇。
  3. Azul Zulu: 由 Azul Systems 提供的 OpenJDK 發行版。Azul 提供了免費版本的 Zulu (通常包含部分 Zulu Prime 的優化) 以及付費的 Zulu Enterprise 版本(提供長期支持和額外工具)。可以在 azul.com 下載。
  4. Amazon Corretto: 亞馬遜提供的 OpenJDK 發行版,提供免費的長期支持。廣泛應用於 AWS 服務中,但也可以在任何地方使用。可以在 aws.amazon.com/corretto 下載。
  5. SapMachine: SAP 提供的 OpenJDK 發行版,針對 SAP 的內部應用和客戶。也是開源免費的。可以在 sapmachine.io 下載。
  6. Red Hat OpenJDK: 紅帽為其企業級 Linux 產品提供的 OpenJDK 版本,也提供獨立的下載。通常提供較長的免費更新支持。
  7. 各種作業系統自帶的 OpenJDK: 許多 Linux 發行版(如 Ubuntu, Fedora, CentOS 等)在其軟體倉庫中提供 OpenJDK 版本,可以直接通過包管理器安裝(apt install openjdk-...-jdkyum install java-...-openjdk-devel)。

如何使用:

無論您選擇哪個發行版,安裝後的使用方法基本相同:

  1. 下載並安裝: 從上述提供商的網站下載適合您作業系統和架構的 JDK 安裝包。
  2. 設置 JAVA_HOME 環境變量:JAVA_HOME 環境變量設置為您的 JDK 安裝目錄的根路徑。這是許多 Java 開發工具(如 Maven, Gradle, Spring Boot, 應用服務器等)查找 JDK 的標準方式。
  3. 將 JDK 的 bin 目錄添加到 PATH 環境變量: 這樣您就可以在任何終端窗口直接運行 java, javac, jar 等命令。
  4. 驗證安裝: 打開終端,運行 java -versionjavac -version 命令,確認顯示的是您剛剛安裝的 OpenJDK 版本信息。

選擇哪個發行版很大程度上取決於您的具體需求:如果您只需要一個基本的、符合標準的 JDK 運行和開發環境,任何一個主流的免費 OpenJDK 發行版都可以。如果您需要特定的長期支持、企業級服務或額外優化,可能需要考慮 Azul Zulu Enterprise 或 Red Hat OpenJDK 等提供商業支持的版本。

第八章:OpenJDK 的未來展望

OpenJDK 的發展是持續且充滿活力的。得益於其快速發布週期(每六個月一個新版本),新的語言特性和平台改進不斷湧現。一些重要的未來方向和正在進行中的項目包括:

  • Project Loom (Virtual Threads): 旨在大幅簡化並發編程,通過引入輕量級的虛擬線程(Virtual Threads)來解決傳統操作系統線程擴展性差的問題。這將是 Java 平台並發模型的一個重大變革。
  • Project Valhalla (Value Types): 旨在引入值類型(Value Types)和原始類型對象化(Primitive Classes),以改善 Java 數據結構的內存佈局和訪問效率,從而提升性能。
  • Project Panama (Foreign Function and Memory API): 旨在改善 Java 與本地程式碼(如 C/C++)的交互方式,提供更安全、更高效的本地函數調用和本地內存訪問機制。
  • Project Amber: 這是持續進行的項目,用於探索和實現 Java 語言的小型、以生產力為導向的特性。已經交付的特性包括局部變量類型推斷 (var)、Switch 表達式、Text Blocks、Records、Sealed Classes、Pattern Matching for instanceof 等。未來會繼續探索更多語法糖和語言改進。
  • 垃圾收集器的持續演進: ZGC 和 Shenandoah GC 等新一代 GC 將繼續優化,提供更低的停頓時間和更好的吞吐量。
  • AOT 編譯: Meskipun JIT 編譯器已經非常強大,但提前編譯(Ahead-Of-Time Compilation, AOT)對於快速啟動和在資源受限環境中運行可能有用。雖然 OpenJDK 主線在這方面進展較慢,但像 GraalVM 這樣的項目(與 OpenJDK 有密切關係)在 AOT 方面取得了顯著成果。
  • 特定領域的改進: 持續改進網路、I/O、圖形、安全等標準庫的性能和功能。
  • 對新硬體和操作系統的支持: 持續將 OpenJDK 移植到新的 CPU 架構和操作系統版本。

這些項目和持續的優化表明,OpenJDK 社區和貢獻者們正積極推動 Java 平台向前發展,使其更能適應現代軟體開發的需求,尤其是在並發、性能和與本地代碼互操作性等方面。

第九章:總結:OpenJDK 的地位與未來

OpenJDK 是現代 Java 的核心和靈魂。它不僅是 Java SE 規範的參考實現,更是整個 Java 生態系統賴以建立的基石。

  • 它通過開源模式確保了 Java 技術的開放性、透明性和可持續性。
  • 它通過社區協作JEP 機制加速了 Java 語言和平台的創新。
  • 它提供了高性能、穩定且功能齊全的 Java 運行環境。
  • 它作為原始碼基礎,支持了眾多不同的 JDK 發行版,滿足了多樣化的用戶需求。

對於任何使用 Java 的個人或組織而言,理解 OpenJDK 的意義、組成和獲取方式至關重要。選擇一個合適的、基於 OpenJDK 的發行版,是構建、部署和運行 Java 應用程式的基礎。

隨著 Project Loom、Valhalla 等前沿技術的成熟和融入,OpenJDK 將繼續推動 Java 平台向更高的並發能力、更優異的性能和更簡潔的編程模型邁進。掌握 OpenJDK 的知識,就是掌握現代 Java 的脈搏。

OpenJ D K 證明了開源的力量,它是全球無數開發者和公司的共同努力成果。它的存在,讓 Java 這門誕生二十多年的語言,依然在軟體世界中保持著蓬勃的生命力。


发表评论

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

滚动至顶部