Java9正式發布,新特性解讀
發布時間:2021-08-03 09:33:29 已幫助:99人
Java 9正式發布,新特性解讀
Jigsaw
首先,談到Java 9大家往往個想到的就是Jigsaw項目,這是一個雄心勃勃的項目。
大家知道,Java已經發展超過20年(95年最初發布),Java和相關生態在不斷豐富的同時也越來越暴露出一些問題,比如Java運行環境的膨脹和臃腫,各種類庫和工具在提供強大功能的同時,也越來越復雜,不同版本的類庫交叉依賴導致Jar Hell等讓人頭疼的問題,這些都阻礙了Java開發和運行效率的提升。
但是由于兼容性等各方面的掣肘,對Java進行大刀闊斧的革新越來越困難,Jigsaw從Java 7階段就開始籌備,Java 8階段進行了大量,終于在Java 9里落地,有種千呼萬喚始出來的意味。
Jigsaw項目的目標是改進Java SE平臺,使其可以適應不同大小的計算設備;改進其安全性,可維護性,提高性能;簡化各種類庫和大型應用的開發和維護。
這個項目的量和難度大大超出了初始規劃。JSR 376 Java平臺模塊化系統(JPMS,Java Platform Module System)作為Jigsaw項目的核心,其主體部分被分解成6個JEP(JDK Enhancement Proposals)
200:The Modular JDK
201:Modular Source Code
220:Modular Run-Time Images
260:Encapsulate Most Internal APIs
261:Module System
282:jlink:The Java Linker
可以看到這是一個龐大的系統工程,Java的方方面面,包括JDK編譯工具,運行時,Java公共API和私有代碼等等,完全是一個整體性的改變。
隨著Java平臺模塊化系統的落地,開發人員無需再為不斷膨脹的Java平臺苦惱,例如,您可以使用jlink工具,根據需要定制運行時環境。這對于擁有大量鏡像的容器應用場景或復雜依賴關系的大型應用等,都具有非常重要的意義。
從軟件開發實踐的角度,Java語言層面提供對模塊的支持,可以鼓勵(當然在某種程度上也可以看作強制)更加規范的開發實踐,利用業界在開發領域幾十年的經驗、教訓總結出的實踐,促進Java生態的健康發展。比如,更加完善的隱藏實現細節,這不僅可以促進面向接口、約定的編程,也可以避免可能的安全風險等。
不過,換個角度來說,天下沒有免費的午餐,由于JPMS是語言平臺層面的支持,它并不是完全透明的,也就是說不管用戶是否真的需要或從中收益,都會或多或少的受其影響。
對此,我們可以從JPMS評審中針對類似深度反射限制之類的激烈爭吵中,深刻體會到。比如,針對反射訪問控制,最終Java 9開發團隊,采取了相對折中的辦法,在反射領域默認保持Java 8的默認行為。Java 9在兼容性方面,相比于過往的版本,采取了更大的容忍度。
不過,Java 9的相當一部分特性仍然是對用戶透明的。只要升級到Java 9,不需要或者很少需要用戶參與動作就能獲益。比如,更加緊湊的字符串實現;改進的競爭鎖機制;改進安全應用性能;利用特定CPU指令優化GHASH和RSA等等,這些都是開箱即用、觸手可得的改進。
Java 9值得關注的新特性
對于部分開發者來說,探究Java內部API或者平臺底層能力是一件非常酷的事情,但這往往并不是非常容易,比如部分能力可能并沒有在歷史版本的公共API中暴露出來(比如Unsafe相關),或者需要特定領域的知識。在Java 9中,不要錯過JEP 193:Variable Handles和JEP 274:Enhanced Method Handles,JEP 259:Stack-Walking API,JEP 285:Spin-Wait Hints等特性。
另外,Java 9中還有很多承上啟下的特性,為未來創新打下基礎或者整合、規范現有碎片化的功能,我會介紹一些有代表性的新特性。
在Java虛擬機領域,JEP 271:Unified GC Logging和JEP 158:Unified JVM Logging,對各種JVM日志進行了統一,大家終于不用為各種碎片化的日志選項苦惱了。
Oracle一直在努力提高Java啟動和運行時性能,希望其能夠在更廣泛的場景達到或接近本地語言的性能。但是,直到今天,談到Java,很多C/C++開發者還是會不屑地評價為啟動慢,吃內存。
簡單說,這主要是因為Java編譯產生的類文件是Java虛擬機可以理解的二進制代碼,而不是真正的可執行的本地代碼,需要Java虛擬機進行解釋和編譯,這帶來了額外的開銷。
JIT(Just-in-time)編譯器可以在運行時將熱點編譯成本地代碼,但是實際應用可能非常龐大,大型Java應用的預熱往往非常耗時,而且非熱點代碼可能根本沒有機會被JIT編譯。
在JDK 9中,AOT(JEP 295:Ahead-of-Time Compilation)作為實驗特性被引入進來,開發者可以利用新的jaotc工具將重點代碼轉換成類似類庫一樣的文件,這樣會大大降低啟動開銷。
另外JVMCI(JEP 243:Java-Level JVM Compiler Interface)等特性,對于整個編程語言的發展,可能都具有非常重要的意義,雖然未必引起了廣泛關注。目前Graal Core API已經被集成進入Java 9,雖然還只是初始一小步,但是完全用Java語言來實現的可靠的、高性能的動態編譯器,似乎不再是遙不可及,這是Java虛擬機開發工程師的福音。
與此同時,隨著Truffle框架和Substrate VM的發展,已經讓個別信心滿滿的工程師高呼“One VM to Rule Them All!”,也許就在不遠的將來Ploygot以一種另類的方式成為現實。
談談Java的未來
前面簡短地談了談Java 9中的一些令人激動的特性,Java 9在取得這些進步的同時,那么在其的研發過程中有哪些教訓,當前和未來遇到了那些挑戰呢?
首先,就是如何更加快速、敏捷地進行創新。在Java 9的開發過程中,非常突出的一點就是,由于Jigsaw項目的延期,導致Java 9的發布一再推遲,這帶來了很多負面影響。大批特性已經完成多時,卻無法及時被實際應用采納,開發者無法及時地從中獲益,也很難盡早發現和反饋可能存在的問題或改進。這不禁讓人反思Java傳統的研發模式的局限性。
針對這些情況,Java首席架構師Mark Reinhold已經發出倡議,建議從傳統的以特性驅動的發布周期,轉變為以時間驅動的(6個月為周期)發布模式,并逐步的將Oracle JDK原有商業特性進行開源,Java Flight Recorder等殺手級工具和特性,一定會大受開發者的歡迎。針對企業客戶的需求,Oracle將以三年為周期發布長期支持版本(long term support)。
第二,隨著云計算和AI等技術浪潮,當前的計算模式和場景正在發生翻天覆地的變化,不僅對Java的發展速度提出了更高要求,也深刻影響著Java技術的發展方向。傳統的大型企業或互聯網應用,正在被云端,容器化應用、模塊化的微服務甚至是函數(FaaS,Function-as-a-Service)所替代。
Java需要在新的計算場景下,改進開發效率。這話說的有點籠統,我談一些自己的體會,Java代碼雖然進行了一些類型推斷等改進,更易用的集合API等,但仍然給開發者留下了過于刻板、形式主義的印象,這是一個長期的改進方向,例如,JEP 286:Local-Variable Type Inference;持續改進并發計算框架,Java的并發特性非常強大和系統,但某種程度上過于復雜,在今年的JVMLS上,阿里巴巴AJDK組介紹了利用協程改進并發的實踐,這是一個令人眼前一亮的創新;Java非常需要更加友好的本地代碼支持,相關的特性有很多好的想法和嘗試,比如Panama項目;Value Types和改進的泛型,有興趣可以參考Valhalla項目。
最后,進一步改進啟動和運行性能、優化計算資源使用。目前,相當一部分的Java類庫和虛擬機特性都是針對長時間、大數據量、高并發等復雜任務進行的優化,但是在部分云計算場景中,比如越來越引起大家關注的FaaS應用,短時間、無狀態的函數正在成為常見的計算單元。那么在這種場景下,Java必須進行相應的改進和創新,才能保持和強化目前在軟件開發領域的競爭力。比如,提高Java運行時啟動速度,尤其是在容器環境的初始化表現;CPU等計算資源調度能力能夠適應容器環境的新情況,最直接的就是Java平臺需要支持基于cgroup等技術的資源管理;針對新場景下的GC優化;如何提高數據密度和計算效率等等。
以上很多方面往往不是孤立的,也不是非常簡單就可以完成的,很多改進都是依賴于相關語言基礎技術的進步和突破,Java的進步需要持之以恒的耐心和持續的努力與投入。
最后,歡迎大家能夠參與到OpenJDK社區,Java是大家的,歡迎您向OpenJDK提供建議、意見或者直接提交自己的改進,在社區中聽見越來越多的來自中國的聲音是非常令人高興的事情,讓我們攜手促進Java的創新和發展。
上一篇:實用朗誦技巧與表達方式
下一篇:Java老矣,尚能飯否?