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.MethodAccessor,java.lang.reflect.Method
委托调用。
动态字节码生成方法比
快得多
- 不受 JNI 开销的影响;
- 不需要每次都解析方法签名,因为每个通过反射调用的方法都有自己唯一的MethodAccessor;
- 可以进一步优化,例如这些 MethodAccessor 可以受益于所有常规的 JIT 优化,如内联、常量传播、自动装箱消除等。
请注意,此优化主要是在 Java code 中实现的,没有 JVM 的帮助。 HotSpot VM 为使这种优化成为可能所做的唯一一件事是跳过对此类生成的 MethodAccessors 的字节码验证。否则验证者将不允许,例如,调用私有方法。
观看 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.MethodAccessor,java.lang.reflect.Method
委托调用。
动态字节码生成方法比
快得多- 不受 JNI 开销的影响;
- 不需要每次都解析方法签名,因为每个通过反射调用的方法都有自己唯一的MethodAccessor;
- 可以进一步优化,例如这些 MethodAccessor 可以受益于所有常规的 JIT 优化,如内联、常量传播、自动装箱消除等。
请注意,此优化主要是在 Java code 中实现的,没有 JVM 的帮助。 HotSpot VM 为使这种优化成为可能所做的唯一一件事是跳过对此类生成的 MethodAccessors 的字节码验证。否则验证者将不允许,例如,调用私有方法。