java反射底层原理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq876551724/article/details/78914210

反射的Method.invoke前15次是调用navite code用C++实现的,后面使用java实现
原因:

Java实现的版本在初始化时需要较多时间,但长久来说性能较好;native版本正好相反,启动时相对较快,但运行时间长了之后速度就比不过Java版了。这是HotSpot的优化方式带来的性能特性,同时也是许多虚拟机的共同点:跨越native边界会对优化有阻碍作用,它就像个黑箱一样让虚拟机难以分析也将其内联,于是运行时间长了之后反而是托管版本的代码更快些。
为了权衡两个版本的性能,Sun的JDK使用了“inflation”的技巧:让Java方法在被反射调用时,开头若干次使用native版,等反射调用次数超过阈值时则生成一个专用的MethodAccessor实现类,生成其中的invoke()方法的字节码,以后对该Java方法的反射调用就会使用Java版。

参考:
关于反射调用方法的一个log
深入分析Java方法反射的实现原理

猜你喜欢

转载自blog.csdn.net/qq876551724/article/details/78914210