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

What is a de-reflection optimization in HotSpot JIT and how does it implemented?

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

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

是的,虽然它主要在 Class 库而不是 JVM 中实现,但有一个优化可以减少反射成本。

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

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

动态字节码生成方法比

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

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