Java 9 发布在即,Oracle OpenJDK 着手优化 Unsafe 类

jopen 8年前
   <p style="text-align: center;"><img alt="" src="https://simg.open-open.com/show/93bf1cd4d50b46aaed98b4fdb06d3508.jpg" /></p>    <p>Java 9正式版预计在2017年2季度发布,目前大部分JEP已经基本成型。其中,最关键特性或许是<a href="/misc/goto?guid=4958972921170983772">JEP 261</a>, 该JEP实现了java平台的模块系统, 具体说明可以参见<a href="/misc/goto?guid=4958858572094367507">JSR376</a>。 模块系统依赖于<a href="/misc/goto?guid=4958972921050334043">JEP260</a>(封装了大部分内部API),导致的结果是<a href="/misc/goto?guid=4958990233135401328">JEP193</a>定义的多个句柄会暴露sun.misc.Unsafe类的功能。此前Info<a href="/misc/goto?guid=4958990233264040235">报道</a>过致力于解决sun.misc.Unsafe句柄问题的团队,可能的解决方案细节亦可参见<a href="/misc/goto?guid=4958990233367665511">另一篇报道</a>。</p>    <p><a href="/misc/goto?guid=4958990233483555665">Bug 8149159</a>最近被提交到JDK Bug管理系统, 建议优化和清理Unsafe类, 包括将参数检查从本地代码移入Java(简化JIT)、 sun.misc.Unsafe类和jdk.internal.misc.Unsafe类的统一、 以及本地代码的整体清理。</p>    <p>2月18日,Oracle工程师Mikael Vidstedt向OpenJDK开发者社区提交了两个补丁(分别针对OpenJDK和OpenJDK HotSpot VM)</p>    <p>关于这两个补丁,Vidstedt总结道:</p>    <blockquote>     <ul>      <li> <p>避免代码重复,sun.misc.Unsafe将全部实现委托给jdk.internal.misc.Unsafe,这意味着java虚拟机(特别是unsafe.cpp)不再需要关心s.m.Unsafe的实现。</p> </li>      <li> <p>s.m.Unsafe的委托方法通常会被内联,但是为了避免性能下降的风险,仍然添加了@ForceInline注解</p> </li>      <li> <p>更新文档,指明用户应该确保Unsafe类的参数正确</p> </li>      <li> <p>参数检查从Unsage.cpp移入java,简化本地代码以及允许JIT进一步优化</p> </li>      <li> <p>放松了特定参数的检查,比方说最近引入的U.copySwapMemory没有检查空指针。具体原因可以参考j.i.m.U.checkPointer的文档。除了U.copySwapMemory,现在Unsafe类方法也都没有对参数执行NULL检查</p> </li>      <li> <p>在U.copySwapMemory类的基础上,对j.i.m.U.copyMemory增加了一个测试案例。请随时提醒我合并过来(本该如此)</p> </li>     </ul>    </blockquote>    <p>在Vidstedt看来,Usage类的清理算是“相当激进”了,值得注意的地方有:</p>    <blockquote>     <ul>      <li> <p>Unsafe_方法以及unsafe.cpp中的其他本地方法被申明为静态方法</p> </li>      <li> <p>新增unsafe.hpp代码文件,文件中移入VM其他组件的一些方法。移除部分“extern”函数声明(不要过度使用extern)</p> </li>      <li> <p>对于不怎么用到的UNSAFE_LEAF,移除警告性质的注释(没有必要,只是个VM_LEAF)</p> </li>      <li> <p>一些简单的leaf方法使用UNSAFE_LEAF</p> </li>      <li> <p>UNSAFE_ENTRY/UNSAFE_END代码块新增大括号,帮助自动缩进</p> </li>      <li> <p>移除未使用的Unsafe_<...>##140形式的函数和宏</p> </li>      <li> <p>更新宏参数,与unsafe.cpp的宏定义保持一致</p> </li>      <li> <p>更换带断言的参数检查,正如前面提及,这些检查移入了j.i.m.Unsafe,移除所有s.m.Unsafe相关的代码</p> </li>     </ul>    </blockquote>    <p><strong>查看英文原文:</strong><a href="/misc/goto?guid=4958990233585045022">Oracle's OpenJDK Cleanup of "Unsafe" Implementation</a></p>    <p>来自:<a href="/misc/goto?guid=4958990233685179027">InfoQ</a></p>