Java的:什么是JITC的反映通胀?(Java: what is JITC's refle

2019-06-23 12:25发布

最近,我遇到了这个有趣的词条和搜索网络上更多地了解它。 但是我发现信息比较粗略。 可能有人PL。 给我的这是什么,为什么是这个有用的一个较详细的解释?

从我发现的信息,它看起来像这样的机制使得反射法的执行速度更快,创造了很多动态类的占用和烫发根内存区域的代价,但我不知道这件事。

Answer 1:

难道一些源代码挖掘和编码自己想出解决办法,并在这里就是我发现:

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

如果通货膨胀启用(noInflation是假的),这个访问点,它使用JNI来运行这个Java方法(我想使用的API像GetObjectClass,和的GetMethodID呼叫*方法)的实现。 这就像决斗调度,并执行与JNI是缓慢的,由于这样那样的原因。 ( 是什么让JNI调用慢? )

后通过反射的方法的15个执行(“15”是默认和可改变),并用noInflation假,基于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



Answer 2:

Java的通货膨胀是通过由方法调用的优化Java反射API 。 它代表罕见的方法调用便宜,立即可用,但缓慢的Java本地接口和频繁的方法调用快,但价格昂贵,运行时产生的方法访问 。



Answer 3:

不知道,虽然,但读这某处通货膨胀意味着反射方法/构造函数的前几个运行(默认为15),(从现在起,到方法的任何参考适用于构造太),它通过JNI这样做; 之后,下一次,它装配加载它的飞行类文件,和。 在这一点上,充分JITting适用,并反映方法进一步要求具有相同的性能,直接调用该方法



文章来源: Java: what is JITC's reflection inflation?