gpt4 book ai didi

java - HotSpot JIT 中的去反射优化是什么?它是如何实现的?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:57:02 31 4
gpt4 key购买 nike

正在观看 Towards a Universal VM在演示文稿之前,我研究了这张幻灯片,其中列出了 HotSpot JIT 所做的所有优化:enter image description here

language-specific techniques部分有一个反反射。我试图在 Internet 上查找有关它的一些信息,但没有成功。我知道这种优化以某种方式消除了反射成本,但我对细节感兴趣。有人可以澄清这一点,或提供一些有用的链接吗?

最佳答案

是的,有一个优化来降低反射成本,尽管它主要是在类库中而不是在 JVM 中实现的。

在 Java 1.4 之前,Method.invoke 通过对 VM 运行时的 JNI 调用工作。每次调用至少需要两次从 Java 到 Native 和返回到 Java 的转换。 VM 运行时解析方法签名,验证传递的参数类型是否正确,执行装箱/拆箱并为调用的方法构造一个新的 Java 框架。这一切都相当缓慢。

从 Java 1.4 开始,如果一个方法被调用超过 15 次,Method.invoke 使用动态字节码生成(可通过 sun.reflect.inflationThreshold 系统属性配置)。负责调用给定特定方法的特殊 Java 类是在运行时构建的。此类实现 sun.reflect.MethodAccessor java.lang.reflect.Method 委托(delegate)调用。

动态字节码生成的方法比它快得多

  • 不受 JNI 开销的影响;
  • 不需要每次都解析方法签名,因为每个通过反射调用的方法都有自己唯一的MethodAccessor;
  • 可以进一步优化,例如这些 MethodAccessor 可以受益于所有常规的 JIT 优化,例如内联、常量传播、自动装箱消除等。

请注意,此优化主要在 Java code 中实现没有 JVM 的帮助。 HotSpot VM 为使这种优化成为可能所做的唯一一件事是跳过对此类生成的 MethodAccessors 的字节码验证。否则,验证者将不允许调用私有(private)方法。

关于java - HotSpot JIT 中的去反射优化是什么?它是如何实现的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28793118/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com