观看Towards a Universal VM演示文稿,我研究了这张幻灯片,其中列出了HotSpot JIT所做的所有优化:
在language-specific techniques
部分中有一个去反射。我试图在互联网上找到有关它的一些信息,但失败了。我知道这种优化在某种程度上消除了反射成本,但我对细节很感兴趣。有人可以澄清一下,或提供一些有用的链接吗?
答案 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}}委托调用的文件。
生成动态字节码的方法要快得多,因为它
请注意,此优化主要在sun.reflect.MethodAccessor中实施,没有JVM帮助。 HotSpot VM唯一可以实现此优化的方法是跳过此类生成的MethodAccessors的字节码验证。否则,验证者不会允许,例如,调用私有方法。