【问题标题】:Java: what is JITC's reflection inflation?Java:JITC 的反射膨胀是什么?
【发布时间】:2012-04-10 02:48:51
【问题描述】:

我最近遇到了这个有趣的术语,并在网上搜索以了解更多信息。然而,我发现的信息是粗略的。有人可以请。给我一个详细的解释这是什么以及为什么有用?

从我找到的信息来看,这种机制似乎使反射方法的执行速度更快,但代价是创建了大量动态类并占用了 perm gen 内存区域,但我不确定。

【问题讨论】:

    标签: java reflection jit


    【解决方案1】:

    Java Inflation 是通过Java Reflection API 进行的方法调用的优化。它将infrequent 方法调用委托给廉价、立即可用但速度很慢的Java Native Interfacefrequent 方法调用到快速但昂贵的运行时generated method accessor

    【讨论】:

    • 我对@9​​87654327@ 定义的看法。
    【解决方案2】:

    我自己挖掘和编码了一些源代码来解决这个问题,这就是我发现的:

    Java 的“Method”类有一个“MethodAccessor”类型的成员变量“methodAccessor”,它是一个带有方法“invoke”的接口,类似于Method 的invoke。方法的调用委托给 methodAccessor 的调用。

    如果启用了通货膨胀(noInflation 为假),则此访问器指向使用 JNI 运行此 Java 方法的实现(我认为使用 API,如 GetObjectClass、GetMethodID 和 Call*Method)。这就像决斗调度,由于这个和其他原因,使用 JNI 执行很慢。 (What makes JNI calls slow?)

    在通过反射('15' 是默认值并且可以更改)和 noInflation 为 false 的方法执行 15 次后,基于 JNI 的访问器会动态创建一个类(名称是动态生成的,例如说 'GeneratedMethodAccessor1')它也有调用方法。现在,在这个 'invoke' 方法中,它将第一个 'obj' 参数转换为其对应的类,然后调用它的目标方法。然后它创建这个类的一个实例,并更改 methodAccessor 设置,以便以后每次执行该方法都委托给这个实例而不是 JNI 访问器。这称为通货膨胀。

    因为这个实例是一个委托给 Java 对象的 Java 类,所以该委托以后是一个普通的 Java 委托。它从不使用 JNI,因此节省了开销,而且 JITC 可以对其执行其他优化,从而提高效率。

    不利的一面是,如果很多方法都以这种方式膨胀,它们的类会占用 permgen 空间,并可能导致内存不足的错误。

    详情见:

    http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/tip/src/share/classes/sun/reflect/ReflectionFactory.java

    http://java.sun.com/docs/books/jni/html/fldmeth.html

    http://anshuiitk.blogspot.com/2010/11/excessive-full-garbage-collection.html

    【讨论】:

      【解决方案3】:

      虽然不确定,但请在某处阅读 膨胀意味着对于反射方法/构造函数的前几次运行(默认 15 次)(从现在开始,对方法的任何引用也适用于构造函数),它通过 JNI 这样做;下一次之后,它会即时组装一个类文件并加载它。此时,完全 JITting 应用,进一步调用该反射方法与直接调用该方法具有相同的性能

      【讨论】:

      • 是的,我也读过,但想要更多细节。有一种称为反射访问器的东西用于执行此操作,但同样不确定如何。
      • 在这里找到一篇博文:buzdin.blogspot.com/2011/01/is-java-reflection-really-slow.html 基本上,在服务器VM中,如果一个调用站点通过反射被调用超过15次,热点将对其进行优化以使用直接方法调用。顺便说一句,Akash,没有涉及 JNI,它只是常规的热点优化。
      猜你喜欢
      • 1970-01-01
      • 2014-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多