背景
1991 年,James Gosling 帶領團隊開始了一個叫"Oak"的項目,這個就是 Java 的前身。1995 年,Java1.0 釋出。“Write once, run anywhere"這句 Java 口号想必大家耳熟能詳。Java 剛開始出現的時候主要面向 Interactive Television 領域,直至後來幾年的發展,當時的 SUN(後來在 2010 年被 Oracle 收購)一度想用 Java 來打造桌面的網絡作業系統,取代當時如日中天的 Windows。不過 Java 後來的發展,不曾想雖未在桌面領域内取得多大的建樹,出乎意料地,卻在企業級應用領域開花結果,占據了如今幾乎統治的地位。失之東隅,卻收之桑榆。
JavaSE 開源現狀
Sun 在 2006 年的 Java One 大會上,宣布 Java 技術開源,随後 2006 年底在 GPL 協定下釋出 HotSpot 以及 javac,這是 Java 發展中的裡程碑事件。阿裡巴巴最早在 2012 簽署 OCA,并參與到了 OpenJDK 的開發。

OpenJDK 是 JavaSE 開源的 Reference Implementation。在 JavaOne 2017 的 Keynote 上 (2018 年 JavaOne 被 Oracle 重命名為 CodeOne),Oracle 承諾将開源所有的 OracleJDK 裡包含的商業實作功能[1]。
在 2018 年釋出的 Java11, Oracle 已經讓 OpenJDK 和 Oracle JDK 兩者的二進制檔案在功能上盡可能互相接近,盡管 OpenJDK 與 OracleJDK 兩者在一些選項之間仍然存在一些差異[2]。
另外,除了 OpenJDK 這條主線,在最近的幾年裡,Java 基礎技術的開源有愈演愈烈趨勢:2017 年,IBM 将内部使用 20 多年之久的 J9 虛拟機開源,并貢獻到 Eclipse Foundation, 而随後 2018 年,Oracle 開源 GraalVM 1.0,其核心包含用 Java 寫的Just-in-Time compiler/Graal, SubstrateVM 以及支援多語言解釋器的 Truffle 架構。各個企業開源的主要動機,想通過開源建構并受益于一個更為強大的語言生态系統。
雲 + 開源結合在一起,使得普通開發者以較低的門檻獲得一流工具(鍊)的使用和體驗,任何一家企業都可以像任何大型組織一樣,使用的相同技術(democratizing),這是開發者的黃金時代。
Java is Still Free: 你該選擇什麼樣的 JDK?
Java 仍然免費,但随着 OracleJDK License 變化開始轉向收費,OpenJDK 會逐漸取代 OracleJDK 成為市場主流,這點也可以從 JVM 2020 生态報告中看出趨勢:OracleJDK 從前一年的 70% 的開發者選擇使用率降到 2020 年的 34%。
OracleJDK 收費,在客觀上也加劇了 OpenJDK 生态的碎片化趨勢,出現了包括 Alibaba Dragonwell 在内的多個基于 OpenJDK 的可選實作。
企業在選擇使用那個 Java Vendor 的 JDK 版本時,幾個方面的考慮因素可以參考:
- 安全與穩定:是否會及時同步上遊的最新更新,包括安全更新檔,關鍵的問題修複等。
- JavaSE 标準相容 :是否與标準 Java 相容。
- 性能與效率:是否可以在問題診斷,性能調優方面提供有效的工具支援,幫助一線的開發同學高效地解決 Java 問題。在 JVM,到 JDK (Class library) 層面,是否有面向企業業務場景的優化特性,可以幫助提升資源的使用率,生産系統的穩定性等等。
- 快速的新技術采納:伴随收費,Oracle 管理 Java 版本生命周期采用了 Long Term Support(LTS) 的概念,Oracle 每三年會指定一個 LTS 的 Java 版本, Java 8/11 都是 LTS 版本。大部分企業,尤其是大中型企業很難跟上 Java 每六個月一釋出的節奏,像 Java 12,13 這樣的 Feature Release(FR) 版本。那麼問題來了,如果你選擇 Stay 在 LTS 版本上,比如 Java 11,在新版本 (Java11+) 釋出的 JVM/JDK 技術,是否可以在不更新的情況下,提前享受這些技術紅利?
這裡分享下 Alibaba Dragonwell 在這些方面的計劃與思考。
Alibaba Dragonwell 是阿裡巴巴内部廣泛使用的 AJDK (AlibabaJDK) 的開源版本,Alibaba Dragonwell 作為基石,支撐了阿裡經濟體内幾乎所有的 Java 業務,經過了雙 11 等大促的考驗。Alibaba Dragonwell 主要針對的場景是資料中心大規模 Java 應用部署情況下,Java 應用穩定性、效率以及性能的優化與提高。
2019 年 3 月阿裡開源 Alibaba Dragonwll 8.0.0,我們也一直正在踐行開源時候的承諾,AJDK 内部使用的特性在逐漸開源。到剛剛釋出 Alibaba Dragonwell 8.3.3,我們已經開源了 JWarmup,ElasticHeap,多租戶,JFR 等衆多功能,協程 Wisp 2.0,GCIH 等也在開源的規劃上。
同時,Alibaba Dragonwell 作為 OpenJDK 的下遊,每個發行版都會同步上遊最新更新,包括安全更新,問題修複等,并經過阿裡内部大規模的應用叢集測試。
在新技術 Adoption 方面,Alibaba Dragonwell 目前釋出和維護了 Java 8,11 兩個 LTS 版本,阿裡 JVM 團隊會根據實際業務狀況,移植 Java11+ 的相關功能到 Java 8 和 11 兩個版本,這樣 Alibaba Dragonwell 使用者可以在不跟進 Java 12,13 等這些 FR 版本的情況下,提前享受這些功能帶來的技術紅利。
OpenJDK技術趨勢
縱觀 Java 技術 20 多年的發展,始終圍繞着兩大主題:Productivity 以及 Performance。在很多情況下,Java 在設計上 Productivity 是優于 Performance 考慮的。Java 引入的 Garbage Collector 把程式員從複雜的記憶體管理中解脫出來,但在另一方面 Java 應用始終困擾于 GC 暫停時間的影響。Java 基于棧式虛拟機的中間位元組碼設計,很好地抽象了不同平台 (Intel, ARM 等) 的差異性,同時通過 Just-in-Time (JIT) 編譯技術,解決的 Java 應用 peak 性能, 但在另一方面 JIT 不可避免引入了 Warmup 的代價,正常情況下 Java 程式永遠需要先 load class,解釋執行,然後再到高度優化的代碼執行。
如果從 JVM 視角來總結梳理下目前 OpenJDK 社群正在發生,孵化的相關技術,主要從工具,GC,編譯器,以及 Runtime 四個方面進行一個主要概括:
JFR/JMC
Oracle 從 Java 11 開源了其之前一直作為商業功能的 JFR,JFR 是功能強大的 Java 應用問題診斷與性能剖析工具。阿裡巴巴也是作為主要的貢獻者,與社群包括 RedHat 等,一起将 JFR 移植到了 OpenJDK 8, 預計 2020 年 7 月即将釋出的 OpenJDK 8u262 (Java8) 将會預設帶有 JFR 功能,這樣 Java 8 的使用者可以基于這個版本免費使用 JFR 功能。
ZGC/Shandoath
無論是 Oracle 在 Java 11 釋出的 ZGC,還是 RedHat 已經做了好幾年的 Shandoath,都實作了 concurrent copy GC,解決 Large Heap 情況下的 GC 停機性能。ZGC 最新狀态,在 9 月份即将釋出的 JDK 15,ZGC 将從 Experimental 功能變為生産可用 [3] 。實際上,在 AJDK 11 上,阿裡巴巴團隊 JVM 團隊已經做了大量 Java 11+ 到 Java 11 的 ZGC 移植工作,以及相關問題修複,2019 年雙 11 和阿裡資料庫團隊一起,讓資料庫應用運作在 ZGC 上,100+ GB Heap 情況下 GC 暫停時間可以保持在 <10ms 以内, 詳細讨論參考[4]。
Graal
用 Java 開發的新一代 Just-in-Time 編譯技術,用來替代目前 HostSot JVM 的 C1/C2 編譯器,OpenJDK 上的 Ahead-of-Time (AOT) 技術也是基于 Graal 編譯器開發。
Loom
OpenJDK 社群協程項目,對應于 AJDK 的 Wisp 2.0 實作,詳細讨論可以參考[5]。
進擊的 Java:面向未來演進
2020,站在一個全新的節點上,本文也從三個大的方面 Cloud Native, AI,以及多語言生态三個方面展望下未來的發展,有些讨論本身是超越 Java 本身的。
面向 Cloud Native 的語言進化
雲原生時代,軟體的傳遞方式發生的根本性變化。以 Java 為例,在之前 Java 開發者傳遞的是應用本身,具體展現在以 "jar", "war" 的形式傳遞, 而雲原生則是以 Container 為傳遞機關的:
在運作方面,面向 Cloud Native 的應用要求:
- Reactive
- Always Watching
- Extreme low memory footprint
- Quick boot time
Java 語言作為企業計算,網際網路領域的王者,擁有一緻性,豐富的建構在 Java 語言之上的生态系統, 豐富的三方庫,多樣的 Serviceability 支援等,随着雲時代應用微服務化,Serverless,這些新的架構逐漸觸及到了 Java 程式速度提升的天花闆 —— Java 自身的啟動運作開銷。
在 Cloud Native 這個新的上下文裡, 我們談論語言的進化,絕不僅僅限于運作時,編譯器層面, 新的計算形态一定伴随着程式設計模型的變革,這涉及圍繞程式語言的 Library,Framework,Tools 等一系列配套的改革。從目前業界來看,也有不少的項目正在發生:配合 GraalVM/SVM (Java 靜态編譯技術) 的下一代程式設計架構 Quarkus, Micronaut, 以及 Helidon,Quarkus 更是提出了“container first” ,他們提倡的分層的 lightweight uber-jar 的概念正是符合了 container 傳遞這一趨勢。而 Red Hat 的 Java 團隊與 OS 團隊合作的"Checkpoint Restore Fast Start-up"技術 (AZul 在 JVM 技術峰會 '2019 上也提出過類似的想法) 則是在更加底層的技術棧上解決 Java 快速拉起問題。
在 Java for Cloud Native 方向,我們也開展了相關研發工作。Java 是靜态語言,但是包含了大量的動态特性,包括反射,Class Loading,Bytecode Instrument (BCI) 等等,這些動态特性本質上都是違反 GraalVM/SVM 所要求的 Closed-World Assumption (CWA) 原則,這也是導緻傳統跑在 JVM 的 Java 應用不容易在 SVM 編譯運作的主要原因。阿裡巴巴 JVM 團隊對 AJDK 做了靜态化裁剪,務求在 Java 靜/動态特性之間找到一個确定的邊界,從 JDK 的層面為 Java 靜态編譯提供可能性。同時向上,與螞蟻中間團隊合作,定義面向靜态編譯的 Java 程式設計模型,通過程式設計架構來限制 - Java 應用的開發是面向靜态編譯友好的。我們靜态編譯了基于螞蟻開源中間件 SOFAStack 建構的服務注冊中心 Meta 節點應用,相較于傳統 的運作在 JVM上,性能有量級的提升:服務啟動時間降低了 17 倍,可執行檔案大小降低了 3.4 倍,運作時記憶體降低了一半。詳見[6]。
AI 的興起,程式設計語言異構計算的新挑戰
2005 年,時任 Intel CTO 的 Justin Rattner,說過 “We are at the cusp of a transition to multicore, multithreaded architectures”, 在前後的十幾年中, 程式設計語言與編譯器領域一直在努力面向 parallel architectural paradigm 做優化探索。随着 AI這些年的興起, 不同的時間節點,相似的場景,面向 FPGA/GPU 異構計算場景,對程式設計語言與編譯器領域提出了新的挑戰。
除了傳統 Compiler 諸如 IBM XL Compilers, Intel Compilers 等做的 Automatic Parallelizing 工作,在極緻性能探索方面,基于多面體模型 (polytope model) 的編譯優化技術作為解決程式并行化、資料局部性優化的一種手段,成為編譯優化領域的研究熱點。
而在 Parallel Languages 層面,對 C&C++ 開發人員,CUDA 的出現降低了 GPU 的程式設計門檻,但 GPU 和 CPU 兩種硬體模型本質差別,導緻過高的開發成本,需要學習和了解更多底層硬體細節,還更不用說更進階語言的開發語言像 Java 等所面臨的底層硬體模型與進階語言之間巨大的 GAP。
在 Java 領域,最早在 JVM 技術峰會 '2014,AMD 曾經分享過他們的 Sumatra 項目,嘗試實作 JVM 與 Heterogeneous System Architecture 目标硬體互動。而在最近,由 The University of Manchester 發起的 TornadoVM 項目,實作包含:一個 Just-in-Time 編譯,支援從 Java bytecode 到 OpenCL 的映射,一個優化的運作時引擎,以及可以保持 Java 堆和異構裝置堆記憶體一緻性的記憶體管理器。TornadoVM 的目标是開發人員不需要了解 GPU 程式設計語言或者相關的 GPU 體系結構知識就可以編寫面向異構的并行程式。TornadoVM 可以透明地運作在 AMD GPUs, NVIDIA GPUs, Intel integrated GPUs 以及 multi-core CPUs 上。
在通用 CPU 領域, OpenJDK 社群的 Vector API 項目 (Panama 的子項目),依賴 CPU 的 SIMD 指令,獲得計算性能的成倍提升,Vector API 在大資料,AI 計算也有非常廣的應用場景。阿裡 JVM 團隊把 Vector API 移植到了 AJDK 11,後續會開源到 Alibaba Dragonwell,分享下我們獲得的基礎性能資料:
時間 (機關: milliseconds) 越短,性能越好
Polyglot Programing,連結多語言生态
Polyglot Programming 并不是一個新的概念。在 Managed Runtime 領域, 2017 年 IBM 開源 Open Managed Runtime(OMR), 以及 2018 年 Oracle 開源 Truffle/Graal 技術。OMR 和 Graal 技術讓開發人員實作一個新的語言成本大幅下降。前者 OMR 以 C、C++ 元件的形式提供了 Garbage Collection (GC), Just-in-Time (JIT) 以及 Reliability, availability and serviceability (RAS,工具)等, 開發人員可以依賴這些元件,通過 'glue' 的方式基于這些元件實作自己的高性能語言。而後者 Truffle/Graal, Truffle 是一個依賴 AST parser 實作新的語言的 Java 架構,本質上是将你的新的語言映射到 JVM 世界。不同于 Scala, JRuby 這些圍繞 JVM 生态本身建構的語言,他們本質是還是 Java, 無論是 OMR, 還是 Truffle/Graal,他們都提供了生産級的 GC,JIT,以及 RAS 服務支援,新開發的語言完全不需要再重新實作這些底層技術。
從業界來看,面向特定領域的 Domain Specific Language (DSL) 語言已經有向這些技術遷移的趨勢,高盛正在與 Graal 社群合作,把他們的 DSL 遷移到 Graal 上。另外 Ruby/OMR, Python/Graal, JS/Graal,WASM/Graal 等這些真正連結不同語言生态的項目,也正在迅速發展起來。
回到 AJDK, Graal 已經在 AJDK 8 開始支援, JS/Graal 這樣成熟的技術,已經在阿裡内部業務上線。
最後
Java 是一項二十多年前被發明出來的技術,她曆經磨難,幾易其主,但卻曆久彌新。這篇報告旨在為 Java 的開發者們梳理下目前的 Java 技術現狀,以及讨論在雲,AI 等這些重要領域内 Java 技術的演進趨勢。在介紹的相關部分,我們也穿插了阿裡的一些工程實踐。作為世界上最大的 Java 使用者之一,我們也一直在探索把前沿的 Java 技術,通過在阿裡豐富的業務場景的試驗,真正把這些技術應用于真實的生産環境。我們也非常樂于分享和貢獻 Java 領域的經驗、實踐與技術洞見,共同促進 Java 的發展。
參考
[1]
https://www.infoq.com/news/2017/10/javaone-opening/ [2] https://www.oracle.com/technetwork/java/javase/11-relnote-issues-5012449.html#Diffs [3] https://openjdk.java.net/jeps/377 [4] https://mp.weixin.qq.com/s/FQpvT5wIy9xwhX2jHMU7aw [5] https://mp.weixin.qq.com/s/K1us6aH-gjHsWGhQ3SulFg [6] https://www.infoq.cn/article/uzHpEbpMwiYd85jYslka