jdk,cglib动态代理性能分析

动态代理

对于jdk和cglib的实现网上文章很多,那到底有没有性能差距呢。
首先我们知道使用动态代理后都会生成对于的代理类,这个代理类是有区别的,jdk生成的类字节码里面是还是使用的是method.invoke(target, args)的反射调用,而如果使用cglib一般会使用直接生成调用父类方法的字节码。

而jdk在版本的优化中,主要是虚拟机对反射调用的优化,在1.6以后,反射方法的调用在15次内,是使用本地方法,也就是native方法,这样会有java到c++代码的转换,但是相对于直接生成目标方法的字节码还是要快很多,所有虚拟机设置了15的默认阈值,超过后会使用ASM生成目标方法字节码动态调用,跟直接调用相差无几,可以在循环中设置16(15次好像没有触发)后,后面的执行时间快很多,而cglib的时间则在都耗时在第一次调用是触发的生成字节码时间。

如果都生成直接调用目标方法后,两种代理的执行时间基本一致。

而和new方法直接调用的差距,主要是代理方法必须要调用method.invoke这段代码,这个多一层的方法调用开销大概是在5-6倍左右,如果能做到方法内联的循环可以缩到2-3倍。

这篇文章比较早,可以细细体会
https://www.iteye.com/blog/javatar-814426
代码可以参考这篇,循环参数可以设置15,16和1,消耗时间可以复现
https://blog.csdn.net/xlgen157387/article/details/82497594
cglib的使用
https://blog.csdn.net/danchu/article/details/70238002
R大的博客,反射的优化
https://www.iteye.com/blog/rednaxelafx-548536
源码的区别
https://blog.csdn.net/john_lw/article/details/79539070

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值