從Java 9發布到現在已經過去兩個月了,根據最新的發布計劃,距離下一個Java版本發布只有四個月時間。Java 10的新特性還在確認當中,所以從現在到GA版中間還是有可能加入重大的變更。不管怎樣,在這四個月里,開發者還是可以期待一些新的特性能夠被添加到Java 10中。
新的特性和增強一般通過Java Enhancement Process(JEP)或Java Community Process標準請求(JSR)進行跟蹤。因為Java 10的時間線較短,范圍也相對較小,所以Java 10的變更將通過JEP進行跟蹤。
有望被包含在Java 10中的特性是那些已經處于Targeted或Proposed狀態的JEP,它們包括:
286:本地變量類型推斷296:統一JDK倉庫304:垃圾回收器接口307:G1的并行Full GC310:應用程序類數據共享312:ThreadLocal握手機制JEP 296是一次純粹的清理工作,而JEP 304加強了不同垃圾回收器的代碼隔離,并為垃圾回收器引入更簡潔的接口。
JEP 304意味著廠商可以更自由地選擇特定的GC算法來構建JDK,因為現在有多種處于開發當中的GC,如Shenandoah、ZGC和Epsilon,在未來可以使用這些GC算法。社區也在努力棄用甚至移除Concurrent Mark Sweep(CMS)垃圾回收器,只是目前還沒有可用的替代品。
比較有意思的變更或許是JEP 286,增強的本地變量類型推斷可以讓開發者免去很多變量申明模板代碼。也就是說,在下一個版本中,下面的變量聲明是合法的:
var list = new ArrayList這種語法只限于初始化過的本地變量和for循環中的本地變量。
它其實是個語法糖,在語義上并沒有任何變化。不過,該特性有可能在Java開發者當中引起熱議。
其他三個變更都將在性能方面帶來一些影響。
JEP 307解決了G1垃圾回收器的一個問題——截止到Java 9,G1的Full GC采用的是單線程算法。也就是說,G1在發生Full GC時會嚴重影響性能。JEP 307的目的就是要采用并行GC算法,在發生Full GC時可以使用多個線程進行并行回收。
JEP 310對類數據共享(CDS)進行了擴展,JVM可以將一些類記錄到一個共享的壓縮文件里,在JVM下一次啟動時可以將這個文件映射到JVM進程,以此來減少啟動時間。該文件也可以在多個JVM間共享,在同一個機器上運行多個JVM時,這樣做可以減少內存占用。
該功能在Java 5中就已存在,但截止到Java 9,該功能只允許bootstrap類加載器加載壓縮的類。JEP 310的目的是擴展該功能,讓應用程序和自定義類加載器也能加載壓縮的類。該特性目前僅在Oracle JDK中可用,OpenJDK并不包含該特性。
JEP計劃將該特性從Oracle私有倉庫中遷移到公共倉庫,從Java 10往后,常規版本(非LTS)將會使用OpenJDK的二進制包。此舉表明有用戶正在使用該特性,所以需要在OpenJDK中也支持該特性。
JEP 312旨在改進虛擬機性能,在應用程序線程上調用回調不再需要執行全局虛擬機安全點操作,這意味著JVM可以停止單個線程。一些底層小改進包括:
降低堆棧跟蹤取樣所帶來的影響(如進行profiling)。減少信號依賴以獲得更好的堆棧取樣。通過停止單獨線程改進偏向鎖。從JVM移除了一些內存屏障。從整體來看,Java 10似乎并沒有包含重大新特性或性能改進。這是可以理解的,畢竟這是新發布周期下的第一個版本。
查看英文原文:Java 10 - The Story So Far