1. 程式人生 > >如約而至,Java 10 正式釋出!109 項新特性一覽

如約而至,Java 10 正式釋出!109 項新特性一覽

來自:開源中國
連結:oschina.net/news/94402/java-10-released-mar-21

期待已久,沒有跳票的 Java 10 已正式釋出!你可以下載 Java 10 正式版:

此前我們曾報道過,為了更快地迭代,以及跟進社群反饋,Java 的版本釋出週期變更為每六個月一次,並且承諾不會跳票。新的釋出週期也會嚴格遵循時間點,將在每年的 3 月份和 9 月份釋出。所以 Java 10 的版本號是 18.3。

Java 10 是採用新發布週期的第一個版本,提供了 109 項新特性,其中最備受關注的莫過於區域性變數的型別推斷。

Java 10 的 12 項關鍵新特性:

JEP 286: 區域性變數的型別推斷。該特性在社群討論了很久並做了調查,可檢視 JEP 286 調查結果
JEP 296: 將 JDK 的多個程式碼倉庫合併到一個儲存庫中
JEP 304: 垃圾收集器介面。通過引入一個乾淨的垃圾收集器(GC)介面,改善不同垃圾收集器的原始碼隔離性。
JEP 307: 向 G1 引入並行 Full GC
JEP 310: 應用類資料共享。為改善啟動和佔用空間,在現有的類資料共享(“CDS”)功能上再次拓展,以允許應用類放置在共享存檔中
JEP 312: 執行緒區域性管控。允許停止單個執行緒,而不是隻能啟用或停止所有執行緒
JEP 313: 移除 Native-Header Generation Tool (javah)
JEP 314: 額外的 Unicode 語言標籤擴充套件。包括:cu (貨幣型別)、fw (每週第一天為星期幾)、rg (區域覆蓋)、tz (時區) 等
JEP 316: 在備用記憶體裝置上分配堆記憶體。允許 HotSpot 虛擬機器在備用記憶體裝置上分配 Java 物件堆
JEP 317: 基於 Java 的 JIT 編譯器(試驗版本)
JEP 319: 根證書。開源 Java SE Root CA 程式中的根證書
JEP 322: 基於時間的版本釋出模式。“Feature releases” 版本將包含新特性,“Update releases” 版本僅修復 Bug

Java 10 的 109 項新特性一出,社群就有熱心使用者翻譯成了中文版,在此感謝他們的努力,下面我們來看看這 109 項新特性都有哪些?

JDK 10 的 109 項新特性

突然然感覺 JDK9 釋出才僅僅幾周的時間,然而,隨著新的 OpenJDK 的釋出節奏,JDK10 已經到達釋出候選里程碑階段。

我看過各種關於 JDK10 新特性的部落格,但是它們都傾向於關注通過 JEPS 定義的大方面。這篇博文,我將看看是否可以羅列出 JDK10 中已經發生變化的方方面面(包括新增的和剔除的)。

有時候,我會做一些關於 Java SE 的報告會。之前我在“ JDK9 的 55 個新特性”的報告會上曾開玩笑說:下次我將做的恐怕是“ JDK10 的 5 個新特性”。然而事實證明,即使僅有六個多月的開發時間,JDK10 依然超乎想象。

即便我不再為 Oracle 工作,我也在此先做一個“安全港宣告”,以便消除誤會。這個列表是由下面這些公開可用的資訊整理編輯的:JDK Enhancement Proposals (JEPs)、the OpenJDK bug database 和 Java SE 10 public review specification (JSR 383) 。當然,儘管我已儘可能的研究以保證資訊準確,但在 JDK 10 最終釋出之前仍可能會發生變化。

大事記

JDK10 包含 12 個JEP (改善提議):

【286】區域性變數型別推斷 :對於開發者來說,這是 JDK10 唯一的真正特性。它向 Java 中引入在其他語言中很常見的 var ,比如 JavaScript 。只要編譯器可以推斷此種類型,你不再需要專門宣告一個區域性變數的型別。一個簡單的例子是:

   var x = new ArrayList<String>();

這就消除了我們之前必須執行的 ArrayList 型別定義的重複。我鼓勵你們去讀 JEP ,因為上面有一些關於這個句法是否能用的規則。

有趣的是,需要注意 var 不能成為一個關鍵字,而是一個保留字。這意味著你仍然可以使用 var 作為一個變數,方法或包名,但是現在(儘管我確定你絕不會)你不能再有一個類被呼叫。

[310]應用類資料共享(CDS) :CDS 在 JDK5 時被引進以改善 JVM 啟動的表現,同時減少當多個虛擬機器在同一個物理或虛擬的機器上執行時的資源佔用。

JDK10 將擴充套件 CDS 到允許內部系統的類載入器、內部平臺的類載入器和自定義類載入器來載入獲得的類。之前,CDS 的使用僅僅限制在了 bootstrap 的類載入器。

[314]額外的 Unicode 語言標籤擴充套件:這將改善 java.util.Locale 類和相關的 API 以實現額外 BCP 47 語言標籤的 Unicode 擴充套件。尤其是,貨幣型別,一週的第一天,區域覆蓋和時區等標籤現在將被支援。

[322]基於時間的版本控制:正如我在之前的部落格中所討論的,我們的 JDK 版本字串格式幾乎與 JDK 版本一樣多。有幸的是,這是最後需要使用到的,我們可以堅持用它。這種格式使用起來很像 JDK9 中介紹的提供一個更加語義的形式。有一件困擾我的事是包含了一個 INTERIM 元素,正如 JEP 提議中所說,“永遠是0”。好吧,如果永遠是0,那它有什麼意義呢?他們說這是為未來使用做保留,但我仍不是很贊同。我認為,這有些冗餘繁雜。

這也消除了在 JDK9 中有過的相當奇怪的情形。第一次更新是 JDK 9.0.1 , 非常符合邏輯。第二次更新是 JDK 9.0.4 ,不合邏輯。原因是,在 JDK9 的版本計數模式下,需要留下空白以便應急或不在預期安排的更新使用。但既然沒有更新是必須的,為什麼不簡單稱之為 JDK 9.0.2 呢?

[319]根證書:在 JDK 中將提供一套預設的 CA 根證書。關鍵的安全部件,如 TLS ,在 OpenJDK 構建中將預設有效。這是 Oracle 正在努力確保 OpenJDK 二進位制和 Oracle JDK 二進位制功能上一樣的工作的一部分,是一項有用的補充內容。

[307] 並行全垃圾回收器 G1 : G1 是設計來作為一種低延時的垃圾回收器(但是如果它跟不上舊的堆碎片產生的提升速率的話,將仍然採用完整壓縮集合)。在 JDK9 之前,預設的收集器是並行,吞吐,收集器。為了減少在使用預設的收集器的應用效能配置檔案的差異,G1 現在有一個並行完整收集機制。

[313]移除 Native-Header 自動生成工具:Java9 開始了一些對 JDK 的家務管理,這項特性是對它的延續。當編譯 JNI 程式碼時,已不再需要單獨的工具來生成標頭檔案,因為這可以通過 javac 完成。在未來的某一時刻,JNI 將會被 Panama 專案的結果取代,但是何時發生還不清楚。

[304]垃圾回收器介面: 這不是讓開發者用來控制垃圾回收的介面;而是一個在 JVM 原始碼中的允許另外的垃圾回收器快速方便的整合的介面。

[312]執行緒-區域性變數管控:這是在 JVM 內部相當低級別的更改,現在將允許在不執行全域性虛擬機器安全點的情況下實現執行緒回撥。這將使得停止單個執行緒變得可能和便宜,而不是隻能啟用或停止所有執行緒。

[316]在備用儲存裝置上的堆分配:硬體技術在持續進化,現在可以使用與傳統 DRAM 具有相同介面和類似效能特點的非易失性 RAM 。這項 JEP 將使得 JVM 能夠使用適用於不同型別的儲存機制的堆。

[317] 試驗性的基於 Java 的 JIT 編譯器:最近宣佈的 Metropolis 專案,提議用 Java 重寫大部分 JVM 。乍一想,覺得很奇怪。如果 JVM 是用 Java 編寫的,那麼是否需要一個 JVM 來執行 JVM ? 相應的,這導致了一個很好的映象類比。 現實情況是,使用 Java 編寫 JVM 並不意味著必須將其編譯為位元組碼,你可以使用 AOT 編譯,然後在執行時編譯程式碼以提高效能。

這項 JEP 將 Graal 編譯器研究專案引入到 JDK 中。並給將 Metropolis 專案成為現實,使 JVM 效能與當前 C++ 所寫版本匹敵(或有幸超越)提供基礎。

[296]: 合併 JDK 多個程式碼倉庫到一個單獨的儲存庫中:在 JDK9 中,有 8 個倉庫: root、corba、hotspot、jaxp、jaxws、jdk、langtools 和 nashorn 。在 JDK10 中這些將被合併為一個,使得跨相互依賴的變更集的儲存庫執行 atomic commit (原子提交)成為可能。

新 API

有 73 項新增內容新增到了標準類庫中。

java.awt.Toolkit
int getMenuShortcutKeyMaskEx(): 確定哪個擴充套件修飾符鍵是選單快捷鍵的適當加速鍵。

java.awt.geom.Path2D:
void trimToSize(): 將此 Path2D 例項的容量計算到它當前的大小。應用可使用此操作將路徑的儲存空間最小化。這個方法也被新增到 Path2D.Double 和 Path2D.Float 類。

java.io.ByteArrayOutputStream:
String toString(Charset): 過載 toString(),通過使用指定的字符集解碼位元組,將緩衝區的內容轉換為字串。

java.io.PrintStream:
lang.io.PrintWriter:
這兩個類都有三個新的建構函式,它們需要額外的 Charset 引數。

java.io.Reader:
long transferTo(Writer): 從這個 Reader 中讀取所有字元,並按照所讀的順序將字元寫入給定的 Writer 。

java.lang.Runtime.Version:
有四種新方法返回新(JEP 322)版本字串欄位的整數值: feature()、interim()、patch() 和 update() 。

java.lang.StackWalker.StackFrame:
String getDescriptor(): 按照 JVM 標準返回此堆疊幀所代表的方法的描述符。
String getMethodType():返回此堆疊幀所代表的方法型別,描述引數型別和返回值型別。

java.lang.invoke.MethodType:
Class