Java6 的类反射瓶颈
来源:互联网 发布:淘宝卖家骂人会扣分吗 编辑:程序博客网 时间:2024/06/09 23:42
用native code就不说了, 当调用次数达到一定的阀值的时候,sun jdk 会使用
MethodAccessorGenerator.generate 生成一个虚拟的class, GeneratedMethodAccessor1,2...之类
你可以在启动参数里 使用 XX:+TraceClassLoading, 可以看到 load 的虚拟的class
从理论上来说,这样的调用等于是生成新的class,直接调用具体的类的方法,性能应该和直接调用的方法接近,或者类似,除了方法调用的入栈和出栈,当然当用hotspot编译运行的时候的,内联可以解决这样的问题。
结果却让人吃惊
在用类反射调用的时候100万次需要3秒,而直接调用却只要10毫秒。
有人说,因为是method的调用,涉及到method的quickCheckMemberAccess,ensureMemberAccess检查,这个你可以通过设置method.setAccessor(true) 绕过成员检查。
主要的原因是: 因为接口的通用性,java 的invoke 方法 是传object, 和object[] 数组的。
也就是如果是简单类型的话,在接口处必须封装成object, 例如 long ,在javac compile的时候 用了Long.valueOf() 转型
那也就是大量了生成了Long 的object, 同时 传入的参数是Object[]数值,那还需要额外封装object数组。
在调用的时候,产生了额外的不必要的内存浪费,当调用次数达到一定量的时候,最终还导致了GC。
接口的通用性在对性能要求不高的系统里通用性非常高,但在对性能要求高的系统里简直就是灾难。
- Java6 的类反射瓶颈
- Java6 的类反射瓶颈解决方案
- Java6学习笔记32——Java6中向量类的使用
- Java6 JDK的安装
- Java6 JDK的安装
- Java6 WebService的发布
- java6的优点
- Java6 WebService的发布
- 程序员的发展瓶颈--如何突破瓶颈,瓶颈--突破瓶颈
- java6
- Java6
- java6
- java6
- java6
- JAVA6
- java6
- java6
- Java6学习笔记——ArrayList类的学习
- 谈谈创业和梦想
- Hibernate三种状态的区分,以及save,update,saveOrUpdate,merge等的使用
- mysql 导入导出
- java 调用存储过程 传入和返回全部是自定义数组
- 通用的MAKEFILE文件
- Java6 的类反射瓶颈
- 每天读一遍,不久你就会变!
- [译]OOSE第7章:Analysis 分析 7.2 The requirements model 需求模型
- C程序存储空间布局
- 90度旋转行列转换之一
- PHP十款提高开发效率的工具
- Delphi TreeView使用笔记
- 数组的练习
- 通过WMI获取设备名,HID设备获取设备描述符的一个折中办法