(給ImportNew加星標,提高Java技能)
轉自:開源中國
自 2 月 7 日開始,Java 12 / JDK 12 就進入了 RC 階段。按照釋出週期,美國當地時間 3 月 19 日,也就是昨天 Java 12 正式釋出了!
Java 12 帶來了一系列新特性:
下邊分別來看看:
JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
Shenandoah:低暫停時間的 GC(實驗性功能)
新增了一個名為 Shenandoah 的 GC 演演算法,透過與正在執行的 Java 執行緒同時進行 evacuation 工作來減少 GC 暫停時間。使用 Shenandoah 的暫停時間與堆大小無關,這意味著無論堆是 200MB 還是 200GB,都將具有相同的暫停時間。
JEP 230: Microbenchmark Suite
微基準測試套件
JDK 原始碼中新增了一套微基準測試套件,開發人員可透過它輕鬆執行已有的微基準測試並建立新的基準測試。
JEP 325: Switch Expressions (Preview)
Switch 運算式(預覽功能)
對 switch 陳述句進行了擴充套件,使其不僅可以作為陳述句(statement),還可以作為運算式(expression),並且兩種寫法都可以使用傳統的 switch 語法,或者使用簡化的 “case L ->” 樣式匹配語法作用於不同範圍並控制執行流。這些更改將簡化日常編碼工作,併為 switch 中的樣式匹配(JEP 305)做好準備。
JEP 334: JVM Constants API
JVM 常量 API
引入 API 來對關鍵類檔案(key class-file)和執行時工件(run-time artifacts)的名義描述(nominal descriptions)進行建模,特別是可從常量池載入的常量。
在新的 java.lang.invoke.constant 包中定義了一系列基於值的符號取用(JVMS 5.1)型別,它們能夠描述每種可載入常量。
符號取用以純 nominal 形式描述可載入常量,與類載入或可訪問性背景關係區分開。有些類可以作為自己的符號取用(例如 String),而對於可連結常量,定義了一系列符號取用型別(ClassDesc、MethodTypeDesc、MethodHandleDesc 和 DynamicConstantDesc),它們包含描述這些常量的 nominal 資訊。
JEP 340: One AArch64 Port, Not Two
只保留一個 AArch64 實現
在保留 32 位 ARM 實現和 64 位 aarch64 實現的同時,刪除與 arm64 實現相關的所有原始碼。
JDK 中存在兩套 64 位 ARM 實現,主要存在於src/hotspot/cpu/arm和 open/src/hotspot/cpu/aarch64 目錄。兩者都實現了 aarch64,現在將只保留後者,刪除由 Oracle 提供的 arm64。這將使貢獻者將他們的精力集中在單個 64 位 ARM 實現上,並消除維護兩套實現所需的重覆工作。
JEP 341: Default CDS Archives
預設類資料共享歸檔檔案
針對 64 位平臺,使用預設類串列增強 JDK 構建過程,以生成類資料共享(class data-sharing,CDS)歸檔。
JEP 344: Abortable Mixed Collections for G1
可中止的 G1 混合 GC
如果混合 GC 的 G1 存在超出暫停標的的可能性,則使其可中止。
JEP 346: Promptly Return Unused Committed Memory from G1
G1 及時傳回未使用的已分配記憶體
增強 G1 GC,以便在空閑時自動將 Java 堆記憶體傳回給作業系統。
為了實現向作業系統傳回最大記憶體量的標的,G1 將在應用程式不活動期間定期執行或觸發併發週期以確定整體 Java 堆使用情況。這將導致它自動將 Java 堆的未使用部分傳回給作業系統。而在使用者控制下,可以可選地執行完整的 GC,以使傳回的記憶體量最大化。
觀望 JDK 13
根據 JDK 13 的迭代計劃,預計其將於 2019 年 9 月釋出 —— Java 現在採取“半年釋出一次版本”的樣式。
對於 JDK 13 的新特性,Oracle Java 平臺組首席架構師 Mark Reinhold 做出了兩個預測:
- 原生字串文字(Raw String Literals),它可以跨多行原始碼而不對跳脫字元進行轉義。標的是簡化 Java 的開發,比如開發者可以可讀形式表示字元序列,而不會摻雜一些 Java 指示符,或者提供針對 Java 以外的語法的字串。在 JDK 13 中進行預期的測試執行後,該功能可以在隨後的 JDK 14 版本中跟進。
- 可用於生產環境的 switch 運算式,JDK 13 中將帶來一個 beta 版本實現。switch 運算式擴充套件了 switch 陳述句,使其不僅可以作為陳述句(statement),還可以作為運算式(expression),並且兩種寫法都可以使用傳統的 switch 語法,或者使用簡化的“case L ->”樣式匹配語法作用於不同範圍並控制執行流。這些更改將簡化日常編碼工作,併為 switch 中的樣式匹配(JEP 305)做好準備。
可訪問 http://openjdk.java.net/projects/jdk/13/ 檢視 JDK 13 的相關資訊。
討論
留意到不少開發者對 Raw String Literals 特性情有獨鐘,該特性類似於 JavaScript ES6 語法中的模板字串,使用它基本可以告別醜陋的字串拼接。特性詳見 http://openjdk.java.net/jeps/326。
該特性原計劃於 JDK 12 釋出,可惜最後還是被取消了(不過可能會在 JDK 13 釋出),詳見:
http://mail.openjdk.java.net/pipermail/jdk-dev/2018-December/002402.html
可能是因為業界呼聲太高,最近委員會又把這個特性拿出來重新討論了:
https://mail.openjdk.java.net/pipermail/amber-spec-experts/2019-January/000931.html
你最想要的 JDK 特性是什麼?在留言區和大家分享吧!~