Java正青春:現狀與技術趨勢報告
發布時間:2021-08-03 09:57:28 已幫助:97人
背景
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。
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開發手冊》,共同促進Java的發展。