美文网首页
java 反射真的慢吗?

java 反射真的慢吗?

作者: ckxx | 来源:发表于2016-08-16 19:48 被阅读0次

大家似乎有个默认的常识:java的反射性能不好,应该使用asm、cglib之类的库替代。

看java的反射实现会有两种情况,参考NativeMethodAccessorImpl

1.调用native方法,涉及到方法查找,

2.生成字节码,动态加载类,使用MethodAccessorGenerator

就是说在调用次数超过阈值15之后,就会动态生成类,来执行反射方法,本质上和直接调用时一样的。动态生成类的模式和cglib也是一样的。

跑了几个测试看看,计算的平均每次用时,用的mac jdk8,jvm参数:-server -Xmx4g -Xms4g -Xmn512m  -Xss256k -verbose:gc (原来想贴一下代码的,简书的“引用”实在太难用了) 

循环次数    1000    10*1000   100*1000     1000*1000

cglib      1392ns    984ns      228ns              78ns

反射        4753ns  980ns        163ns              36ns

从测试结果看出来,次数越多,反射的性能越好,这是为什么呢?和jit编译有关,使用-XX:+PrintCompilation可以看到,循环次数到达1000*1000的时候,不仅编译层数达到了4,而且发生了OSR编译(栈上替换),运行在OSR代码中的次数越多,性能越好。

同样的cglib的FastClass也会发生jit编译,也会使用OSR编译,但是性能比不过反射,同时通过监控内存,发现cglib使用的内存也比较多,主要是动态生成类的代码不一样。

cglib的FastClass是针对一个类动态生成一个新的类;反射是针对每一个方法生成一个新的类,方法体比较小,更适合jit做动态编译、内联。

加上-XX:+PrintInlining 参数,看内联的情况,反射的方法都经过了内联优化,而使用cglib生成的代码无法内联,容易出现hot method too big的情况。

查看cglib代码可以通过System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY,"./");将动态生成的代码保存到文件。

相关文章

  • java 反射真的慢吗?

    大家似乎有个默认的常识:java的反射性能不好,应该使用asm、cglib之类的库替代。 看java的反射实现会有...

  • java的反射功能

    rovider的调用都会用到java的反射功能,有人说使用反射会慢,那么到底慢在哪里呢? 反射 反射使JAVA语言...

  • 反射的性能差在哪里?

    一直以来都在说反射慢,但是根本没有具体测试过,也没感受过 反射真的慢吗? 参考:https://www.jians...

  • Unsafe.defineClass挂起-反射速度慢实战案例

    Unsafe.defineClass挂起-反射速度慢 在Java 8 / SpringBoot 1.5.13 / ...

  • 博客地址

    java注解-01、java注解-02、Git面试资源java反射-01、java反射-02、java反射-03为...

  • Java反射机制入门

    Java反射机制入门 一、什么是反射 JAVA反射机制(The JAVA reflection mechanism...

  • java反射为何会慢

    反射是动态的对类型、方法进行解析,肯定是会比直接调用慢一点。jvm无法进行优化

  • Java基础之反射

    Java基础之—反射(非常重要)Java中反射机制详解Java进阶之reflection(反射机制)——反射概念与...

  • 反射之一

    总结内容源自一下文章粗浅看java反射机制反射机制应用实践谈谈java反射机制Java Reflection(反射...

  • 反射之二

    总结内容源自一下文章粗浅看java反射机制反射机制应用实践谈谈java反射机制Java Reflection(反射...

网友评论

      本文标题:java 反射真的慢吗?

      本文链接:https://www.haomeiwen.com/subject/zwcesttx.html