自 2 月 7 日開始,Java/JDK 12 就進入了 RC 階段。按照發布周期,美國當地時間 3 月 19 日,也就是北京時間 20 號 Java 12 正式發布了!
△ JDK 12 GA 發布
Java 12 帶來了一系列新特性:
下邊分別來看看:
1、Shenandoah:低暫停時間的 GC(實驗性功能)
新增了一個名為 Shenandoah 的 GC 算法,通過與正在運行的 Java 線程同時進行 evacuation 工作來減少 GC 暫停時間。使用 Shenandoah 的暫停時間與堆大小無關,這意味著無論堆是 200 MB 還是 200 GB,都將具有相同的暫停時間。
2、微基準測試套件
JDK 源碼中新增了一套微基準測試套件,使開發人員可以輕松運行現有的微基準測試并創建新的基準測試。
3、Switch 表達式(預覽功能)
擴展了 switch 語句,使其不僅可以作為語句(statement),還可以作為表達式(expression),并且兩種寫法都可以使用傳統的 switch 語法,或者使用簡化的“case L ->”模式匹配語法作用于不同范圍并控制執行流。這些更改將簡化日常編碼工作,并為 switch 中的模式匹配(JEP 305)做好準備。
4、JVM 常量 API
引入 API 對關鍵類文件和運行時工件建模,特別是可從常量池加載的常量。在新的 java.lang.invoke.constant 包中定義了一系列基于值的符號引用(JVMS 5.1)類型,它們能夠描述每種可加載常量。
符號引用以純 nominal 形式描述可加載常量,與類加載或可訪問性上下文區分開。有些類可以作為自己的符號引用(例如 String),而對于可鏈接常量,定義了一系列符號引用類型(ClassDesc、MethodTypeDesc、MethodHandleDesc 和 DynamicConstantDesc),它們包含描述這些常量的 nominal 信息。
5、只保留一個 AArch64 實現
刪除了與 arm64 相關的所有源,同時保留 32 位 ARM 實現和 64 位 aarch64。
JDK 中存在兩套 64 位 ARM 實現,主要存在于 src/hotspot/cpu/arm 和 open/src/hotspot/cpu/aarch64 目錄。兩者都實現了 aarch64,現在將只保留后者,刪除由 Oracle 提供的 arm64。這將使貢獻者將他們的精力集中在單個 64 位 ARM 實現上,并消除維護兩套實現所需的重復工作。
6、默認類數據共享歸檔文件
針對 64 位平臺,使用默認類列表增強 JDK 構建過程以生成類數據共享(class data-sharing,CDS)檔。
7、可中止的 G1 Mixed GC
如果 G1 Mixed GC 存在超出暫停目標的可能性,則使其可中止。
8、G1 及時返回未使用的已分配內存
增強 G1 GC,在空閑時自動將 Java 堆內存返回給操作系統。為了實現向操作系統返回最大內存量的目標,G1 將在應用程序不活動期間定期執行或觸發并發周期以確定整體 Java 堆使用情況。這將導致它自動將 Java 堆的未使用部分返回給操作系統。而在用戶控制下,可以可選地執行完整的 GC,以使返回的內存量最大化。
觀望 JDK 13
根據 JDK 13 的迭代計劃,預計將于 2019 年 9 月發布 —— Java 現在采取“半年發布一次版本”的模式。
可訪問 http://openjdk.java.net/projects/jdk/13/ 查看 JDK 13 的相關信息。
討論
留意到不少開發者對 Raw String Literals 特性情有獨鐘,該特性類似于 Java ES6 語法中的模板字符串,使用它基本可以告別丑陋的字符串拼接。特性詳見:
http://openjdk.java.net/jeps/326
該特性原計劃于 JDK 12 發布,可惜最后還是被取消了,詳見:
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
來源開源中國社區:
https://www.oschina.net/news/105278/java-12-released-mar-19
你最想要的 JDK 特性是什么?在留言區和大家分享吧!