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

时间:2015-03-01 11:42:09

标签: java optimization jvm jit jvm-hotspot

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

language-specific techniques部分中有一个去反射。我试图在互联网上找到有关它的一些信息,但失败了。我知道这种优化在某种程度上消除了反射成本,但我对细节很感兴趣。有人可以澄清一下,或提供一些有用的链接吗?

1 个答案:

答案 0 :(得分:9)

是的,虽然它主要在类库中实现而不是在JVM中实现,但是有一种优化可以降低反射成本。

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

由于Java 1.4 Method.invoke使用动态字节码生成,如果方法被调用超过15次(可通过sun.reflect.inflationThreshold系统属性配置)。负责调用给定特定方法的特殊Java类是在运行时构建的。该类实现了java.lang.reflect.Method {{1}}委托调用的文件。

生成动态字节码的方法要快得多,因为它

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

请注意,此优化主要在sun.reflect.MethodAccessor中实施,没有JVM帮助。 HotSpot VM唯一可以实现此优化的方法是跳过此类生成的MethodAccessors的字节码验证。否则,验证者不会允许,例如,调用私有方法。