Java 9 發布在即,Oracle OpenJDK 著手優化 Unsafe 類

jopen 8年前發布 | 17K 次閱讀

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

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!