Java 9 發布在即,Oracle OpenJDK 著手優化 Unsafe 類
Java 9正式版預計在2017年2季度發布,目前大部分JEP已經基本成型。其中,最關鍵特性或許是JEP 261, 該JEP實現了java平臺的模塊系統, 具體說明可以參見JSR376。 模塊系統依賴于JEP260(封裝了大部分內部API),導致的結果是JEP193定義的多個句柄會暴露sun.misc.Unsafe類的功能。此前Info報道過致力于解決sun.misc.Unsafe句柄問題的團隊,可能的解決方案細節亦可參見另一篇報道。
Bug 8149159最近被提交到JDK Bug管理系統, 建議優化和清理Unsafe類, 包括將參數檢查從本地代碼移入Java(簡化JIT)、 sun.misc.Unsafe類和jdk.internal.misc.Unsafe類的統一、 以及本地代碼的整體清理。
2月18日,Oracle工程師Mikael Vidstedt向OpenJDK開發者社區提交了兩個補丁(分別針對OpenJDK和OpenJDK HotSpot VM)
關于這兩個補丁,Vidstedt總結道:
避免代碼重復,sun.misc.Unsafe將全部實現委托給jdk.internal.misc.Unsafe,這意味著java虛擬機(特別是unsafe.cpp)不再需要關心s.m.Unsafe的實現。
s.m.Unsafe的委托方法通常會被內聯,但是為了避免性能下降的風險,仍然添加了@ForceInline注解
更新文檔,指明用戶應該確保Unsafe類的參數正確
參數檢查從Unsage.cpp移入java,簡化本地代碼以及允許JIT進一步優化
放松了特定參數的檢查,比方說最近引入的U.copySwapMemory沒有檢查空指針。具體原因可以參考j.i.m.U.checkPointer的文檔。除了U.copySwapMemory,現在Unsafe類方法也都沒有對參數執行NULL檢查
在U.copySwapMemory類的基礎上,對j.i.m.U.copyMemory增加了一個測試案例。請隨時提醒我合并過來(本該如此)
在Vidstedt看來,Usage類的清理算是“相當激進”了,值得注意的地方有:
Unsafe_方法以及unsafe.cpp中的其他本地方法被申明為靜態方法
新增unsafe.hpp代碼文件,文件中移入VM其他組件的一些方法。移除部分“extern”函數聲明(不要過度使用extern)
對于不怎么用到的UNSAFE_LEAF,移除警告性質的注釋(沒有必要,只是個VM_LEAF)
一些簡單的leaf方法使用UNSAFE_LEAF
UNSAFE_ENTRY/UNSAFE_END代碼塊新增大括號,幫助自動縮進
移除未使用的Unsafe_<...>##140形式的函數和宏
更新宏參數,與unsafe.cpp的宏定義保持一致
更換帶斷言的參數檢查,正如前面提及,這些檢查移入了j.i.m.Unsafe,移除所有s.m.Unsafe相關的代碼
查看英文原文:Oracle's OpenJDK Cleanup of "Unsafe" Implementation
來自:InfoQ