java的反射机制速度很慢_jvm 反射 invoke inflation机制 优化速度 反射效率比较慢的原因...

学习于:掘金小册​juejin.im

前面相关基础介绍:何柄融:java 反射总结​zhuanlan.zhihu.com何柄融:Java提高程序可扩展性--反射机制​zhuanlan.zhihu.com

然后这次在掘金小册​juejin.im

学习到了反射底层的inflation机制,所以在这里记录一下。

关键还是 invoke 方法的底层实现。

当这个方法调用次数少于15次时,使用调用native方法。大于15次之后则使用ASM生成新的类类处理反射调用。

这就是inflation机制。

由于ASM生成新的类要花比较长的时间,比直接native调用要长3倍左右的时间。但是生成类以后,native调用就会比ASM调用花的时间长20倍。

也就说总的关系是

ASM生成类之后的调用=1/3 native调用=1/60 ASM生成类前的调用

(这里的比例并不精确,只是大概,大家有个基本认识就好)

所以刚开始不知道你反射要调用多少次,所以优先采用native调用。然后后面发现你反射居然要调用那么多次,那干脆给你ASM生成新类调用还快点。

这个类似于Java的编译执行何解释执行,有兴趣的可以参考:何柄融:编译原理基础 java的编译 解释执行 编译执行​zhuanlan.zhihu.com

都是有一个计数器来这里计数,然后根据工程师的计算设定阈值,然后来达到优化速度的目的。

然后可以参考:07 | JVM是如何实现反射的?​www.bilibili.comjava的反射机制速度很慢_jvm 反射 invoke inflation机制 优化速度 反射效率比较慢的原因..._第1张图片黑子:07 JVM 是如何实现反射的​zhuanlan.zhihu.comjava的反射机制速度很慢_jvm 反射 invoke inflation机制 优化速度 反射效率比较慢的原因..._第2张图片

对inflation机制加深一步了解。

然后是Java反射效率比较慢的原因:

下面是统一说法:

啊啊

啊啊

还有讨论Java编译器优化不了反射之类的。这方面都不太懂。

一个大佬的理解是:查找确定真正的函数(可能是接口方法什么的)、判断权限比较慢(static,出入栈)。

我想着前面说的拆箱装箱也是个问题。

还有的就是前面文章说的,如果服务器启动前就什么都搞定好了,那么服务器启动慢一点也没事,这样运行的时候就不会再慢了。反射就是在运行时慢一点。

我也不确定反射会慢多少,看网上说的,也不会多慢,inflation机制本身就是一种反射的优化。

嗯嗯,现在还是菜鸟,笔记下来留点印象,以后有机会接触到那个领域再去验证。

欢迎交流套路。

你可能感兴趣的:(java的反射机制速度很慢)