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

标签 java optimization jvm jit jvm-hotspot

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

特定于语言的技术部分中存在反反射。我试图在互联网上查找有关它的一些信息,但失败了。我知道这种优化以某种方式消除了反射成本,但我对细节感兴趣。有人可以澄清这一点,或者提供一些有用的链接吗?

最佳答案

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

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

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

动态字节码生成方法要快得多

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

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

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

相关文章:

c++ - 具有动态分配成员的动态创建对象的访问成本

algorithm - 修改具有边权重和距离的欧几里德图的星形路由

java - Tomcat 内存消耗

java - 引用任何实现两个或多个给定接口(interface)的类的对象

c++ - System.arraycopy 的 OpenJDK 实现

java - IntelliJ IDEA 项目中的用户相关文件

Java Firebase 数据库设置

java - 使用 Mockito/Powermock 框架模拟最终私有(private)变量

java - 找不到以下类: Names of layouts

r - 拟合反函数