Java 10 新特性解密,引入型別推斷機制,將於 2018 年 3 月 20 日釋出

搜雲庫技術團隊發表於2019-01-28

JDK 10 何時釋出?

JDK 10 是 Java 10 標準版的部分實現,將於 2018 年 3 月 20 日釋出,改進的關鍵點包括一個本地型別推斷、一個垃圾回收的“乾淨”介面。
Oracle 已經為 Java 設定了六個月的發行計劃。之前本打算根據發行的年份和月份命名升級版和後續版,這樣的話第一個版本就會被稱為 Java 18.3, 但這個計劃後來被中止了。
如何下載 JDK 10?
使用者要先加入早期使用者計劃,然後才可以下載 JDK 10 測試版

如何下載 JDK 10?

使用者要先加入早期使用者計劃,然後才可以下載 JDK 10 測試版

jdk.java.net/10/

OpenJDK download.java.net/java/jdk10/…

Oracle JDK download.java.net/java/jdk10/…

JDK 10 的主要功能包括:

一個區域性變數型別推斷,通過增強語言特性將型別推斷擴充套件到區域性變數,目的是減少與編碼相關的“儀式”,同時保持對靜態型別的安全承諾。

一個乾淨的垃圾收集器介面,用來改善垃圾收集器原始碼之間的隔離效果,這樣可以為HotSpot 虛擬機器中的內部垃圾收集程式碼提供更好的模組化功能,也可以更容易向 HotSpot 新增新的垃圾收集器。

並行、完整的 G1 垃圾收集器,通過實現並行性來改善最壞情況下的延遲問題。

啟用 HotSpot 將物件堆分配給使用者指定的備用記憶體裝置(如 NVDIMM 記憶體模組),這個特性也側面預示了未來的系統可能會採用異構的記憶體架構。

在 Linux / x64 平臺上以實驗性方式啟用基於 Java 的即時編譯器(https://www.infoworld.com/article/3187868/application-development/oracles-java-on-java-experiment-picks-up-steam.html)。

將 JDK 的多個儲存庫合併成一個,簡化開發。目前的程式碼庫被分解成了多個庫,容易出現原始碼的管理問題。

應用程式資料共享,通過跨程式共享通用類的後設資料,減少空間佔用及啟動時長。

執行緒本地握手,不執行全域性 VM 安全點也能對執行緒執行回撥,同時實現單執行緒停止回撥。

JDK 提供了一組預設證照,開源 Java SE 的 CA程式,對開發人員更具吸引力。

新功能

與之前的JDK版本一樣,對於即將到來的JDK 10也有一些主要特性。這些特性可以分為兩個主要類別:(1)目標釋出,(2)建議釋出。前者表示某些特性已計劃在JDK 10中釋出,後一種型別表示這些特性還需要增加支援和成熟度。一旦條件允許,它就可以升級為一個目標釋出狀態。

目標釋出

目前有兩個主要功能針對JDK 10:

  • 區域性變數型別推斷,這將刪除大部分物件例項化所需的冗長的包含手動型別資訊

  • 整合源樹source tree的JDK庫,即不同的JDK庫將被合併成一個單一的儲存庫。

1. 區域性變數型別推斷

強型別程式語言有很多優點,包括在編譯時發現型別錯誤,但是它們也引入了大量的樣板程式碼,特別是在定義區域性變數時。例如,當我們希望例項化一個物件時,我們被迫在賦值的左側提供顯式型別,並在賦值的右邊提供實現型別,如下面的片段所示:

MyObject value = new MyObject();
複製程式碼

但是,當這個過程重複出現大量任務時,物件例項化可能變得令人沮喪和乏味。許多最流行的強型別的程式語言,比如C++, C#以及Go,在定義過程中,提供一種區域性變數型別推斷的功能(例如C++提供了auto 關鍵字,C#提供var關鍵字)。但是,Java仍缺乏這樣的功能,它要求開發人員顯式宣告變數的預期清單型別。

為了解決這個問題,Java開發工具包(JDK)改進建議(JEP)286提出了一個上下文敏感的關鍵字var,允許區域性變數被以下方式初始化:

var value = new MyObject();
var list = new ArrayList<MyObject>();
複製程式碼

但是,當這個過程重複出現大量任務時,物件例項化可能變得令人沮喪和乏味。許多最流行的強型別的程式語言,比如C++, C#以及Go,在定義過程中,提供一種區域性變數型別推斷的功能(例如C++提供了auto 關鍵字,C#提供var關鍵字)。但是,Java仍缺乏這樣的功能,它要求開發人員顯式宣告變數的預期清單型別。

為了解決這個問題,Java開發工具包(JDK)改進建議(JEP)286提出了一個上下文敏感的關鍵字var,允許區域性變數被以下方式初始化:

var value = new MyObject();
var list = new ArrayList<MyObject>();
複製程式碼

由於var關鍵字是上下文敏感的,它的使用有下面的規則定義:

程式碼使用var作為一個變數、方法或包名稱時將不受影響;而使用var作為類或介面名稱的程式碼將受到影響。

同樣,型別推斷將受到以下方式的約束:

推斷型別將被限制在區域性變數的初始化,增強的for迴圈索引,以及傳統的for迴圈中宣告;它(將)不用於方法形式、建構函式形式、方法返回型別、欄位、捕獲形式,或任何其他型別的變數宣告。

考慮到所有的限制和細微差別,這個特性將有助於在開發人員建立的應用程式Java程式碼中減輕大量的單調無聊的動作,並簡化JDK程式碼庫。更多資訊可以在官方的JEP 286規範中找到。

2. 整合的JDK庫

目前,有8個不同的Mercurial儲存庫用於儲存包含JDK的大量原始碼:

root
corba
hotspot
jaxp
jaxws
JDK
langtools
nashorn
複製程式碼

雖然過多的儲存庫提供了對組成JDK的各種元件並清晰分離,但管理多個儲存庫存在一些主要的缺點。

其中最重要的一點是,在JDK的兩個不同部分,單個錯誤修復程式不能被原子跟蹤。例如,如果一個bug修復需要對獨立儲存庫中包含的系統的兩個部分進行更改,那麼必須提交兩個提交:每個儲存庫中一個。這種不連續性很容易地降低專案和原始碼管理工具的可跟蹤性和複雜性。

為了解決這個問題,JEP 296建議將所有現有儲存庫合併到一個Mercurial儲存庫中。這種合併的一個次生效應是,這個單一的Mercurial儲存庫比現有的8個儲存庫要更容易的被映象(作為一個Git儲存庫)。

雖然在這個整合過程中,外部開發人員有一些阻力,但是JDK開發團隊似乎已經致力於使這一更改成為JDK 10的一部分。有關更多資訊,請參見JEP 296,並提議整合由Michael Redlich釋出的JDK 10 OpenJDK Mercurial儲存庫宣告。

建議釋出

除了兩個目標特性之外,JDK 10目前還有三個建議,其中兩個主要是對JDK的垃圾收集器部分進行升級,另一個側重於對JDK的本地執行緒功能進行升級。

1 .清理垃圾收集介面

在當前的JDK結構中,組成垃圾收集器(GC)實現的元件分散在程式碼庫的各個部分。儘管這些慣例對於使用GC計劃的JDK開發者比較熟悉,但對新的開發人員來說,對於特定GC的原始碼,或者建立一個新的GC常常會感到困惑。更重要的是,隨著Java modules的出現,我們希望在構建過程中排除不需要的GC,但是GC介面的當前橫切結構排除了這種增強。

JEP 304被設計為解決此問題的方案,並建議整合並清理GC介面,以便更容易地實現新的GC,並更好地維護現有的GC。本建議完成後,GC執行將負責提供以下內容:

  • heap,CollectedHeap的子類

  • barrier set,BarrierSet的子類,它實現了執行時的各種障礙

  • 一個CollectorPolicy的實現

  • GCInterpreterSupport的實現,它實現瞭直譯器的GC的各種障礙(使用匯編指令)

  • GCC1Support的實現,它為C1編譯器實現了GC的各種障礙

  • GCC2Support的實現,它為C2編譯器實現了GC的各種障礙

  • 最終GC特定引數的初始化

  • 設定MemoryService、相關的記憶體池、記憶體管理器等。

有關這些更改的更多資訊,請參見JEP 304規範;有關Java GC的更多資訊,請參閱Oracle提供的垃圾收集器基礎指南。

2. G1垃圾收集器並行化

隨著JDK 9的釋出,Garbage-First(G1)GC取代了Parallel Collector作為預設GC。為了減少JDK 9之外的JDK版本中垃圾收集的影響,G1收集器將被並行化(以匹配並行收集器的特徵)。雖然目前還沒有關於這個並行化的實現細節的資訊,但是可以在JEP 307規範中找到關於此更改的更多細節。

有關GC實現的更多資訊,請參閱Oracle的G1指南和並行收集器指南。

3. 專案執行緒區域性握手

當前,停止Java執行緒是一個“全部或沒有”的過程,需要一個Java虛擬機器(JVM)的安全點,以使一個執行緒停止。為了讓單獨的執行緒停止,JEP 312提議將回撥包含到執行緒中。這一更改受到了限制,因為它顯著地提高了現有JVM功能的效能開銷,並且改變了到達JVM全域性安全點的現有時間語義。有關這個建議的更多資訊,請參閱JEP 312的Thread-Local Handshake OpenJDK討論。

結論

儘管JDK 9對於許多Java開發人員非常新鮮,但它的發展並沒有停止。特別是,JDK 10承諾為區域性變數例項化引入型別推斷機制,並將現有的JDK儲存庫合併到一個Mercurial儲存庫中。

此外,在更成熟和更支援的情況下,JDK 10還可能包括一些重要的升級到GC介面和預設的GC實現,以及升級到JVM中單個執行緒的可定址能力。雖然JDK 10的釋出在未來仍然相對較遠,而且包含的特性很可能會成為Java時間軸上的一個重要里程碑。

來源:CodeBay :codebay.cn/post/6349.h…

Contact

  • 作者:鵬磊
  • 出處:www.ymq.io
  • 版權歸作者所有,轉載請註明出處
  • Wechat:關注公眾號,搜雲庫,專注於開發技術的研究與知識分享
關注公眾號-搜雲庫
搜雲庫

相關文章