Java 9新特性解讀,等你來看

AABBbaby發表於2017-10-12

MyEclipse超值折扣 限量 100 套! 立即開搶>>

MyEclipse最新版下載

在歷經多次跳票之後,Java 9 終於在千呼萬喚中正式釋出。從這個版本開始,Java 將每半年釋出一個版本。作為霸佔程式語言排行榜鰲頭多年的老牌語言,Java 9 中有哪些不得不說的新特性?Java 語言的未來又將如何?

針對 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 的創新和發展。

本文轉載自楊曉峰 InfoQ

更多資訊敬請訪問MyEclipse中文網>>

相關文章