java反射为什么慢

http://rednaxelafx.iteye.com/blog/548536

根据这篇文章总结,每一个Method都有一个root,不暴漏给外部,而是每次copy一个Method。具体的反射调用逻辑是委托给MethodAccessor的,而accessor对象会在第一次invoke的时候才创建,是一种lazy init方式。而且默认Class类会cache method对象。目前MethodAccessor的实现有两种,通过设置inflation,一个native方式,一种生成java bytecode方式。native方式启动快,但运行时间长了不如java方式,个人感觉应该是java方式运行长了,jit compiler可以进行优化。所以JDK6的实现,在native方式中,有一个计数器,当调用次数达到阀值,就会转为使用java方式。默认值是15。java方式的实现,基本和非反射方式相同。主要影响性能的问题,1是method.invoke中每次都要进行参数数组包装,2.在method.invoke中要进行方法可见性检查,3在accessor的java实现方式下,invoke时会检查参数的类型匹配。而在JDK7中methodhandle来做反射调用,形参和实参是准确的,所以只需要在链接方法的时候做检查,调用时不用再做检查。并且methodhandle是不可变值,所以jvm可以做激进优化,例如内联。

转载于:https://my.oschina.net/heatonn1/blog/193524

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值