微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Java:JITC反思通货膨胀是什么?

我最近碰到这个有趣的词汇,并在网上搜索了解更多.然而,我发现的信息是粗略的.可能有人给我一个详细的解释,这是什么,为什么这是有用的?

从我发现的信息中,看起来这种机制使得反射方法执行更快,牺牲了创建大量的动态类和占用永久内存区域,但我不确定.

解决方法

有一些源代码挖掘和编码自己来计算出来,这是我发现的:

Java的’Method’类有一个“MethodAccessor”类型的成员变量’methodAccessor’,它是一个方法’invoke’的接口,类似于Method的调用.方法调用方法来访问methodAccessor的调用.

如果启用通货膨胀(noInflation为false),则该访问器指向使用JNI运行此Java方法的实现(我认为使用api的GetobjectClass,getmethodID和Call * Method).这就像决斗派遣,由于这个原因和其他原因,JNI的执行速度很慢.
(What makes JNI calls slow?)

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

因为这个实例是一个委托给Java对象的java类,所以后来的委托是一个普通的Java委托.它永远不会去JNI,因此节省了开销,加上JITC可以对其进行其他优化,因为它变得高效.

缺点是,如果以这种方式充斥了很多方法,它们的类占用多余空间,并且可能导致内存不足错误.

详情请参阅:

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐