JAVA动态代理 内存溢出的 原因
本人在开发一个项目过程中,由于后期并发量的问题,发生内存溢出情况,定位问题在于SpringAOP配置,引发的
至今,查找了众多资料来探讨一下为什么会引发内存溢出
首先动态代理市面上存在两种类型,
一种是基于JDK的动态代理此代理 不会引了内存溢出。
另一种是基于cglib的动态代码,此代理在设置用户缓存为true时不会产生内存溢出,设置为false时,是会引发内存溢出的
来看图
由图可以看到,enhancer .setUseCache为false时,产生的代理类,都是不同的,如果不断的产生新的代理类会撑爆方法区(JDK1.7及以下)或者元空间区(JDK.18)
如果enhancer.setUserCache(true),则生成的代理类都会复用原先产生在缓存中的类,所以至始至终都只有一个代理类,所以不会产生内存溢出
总结,如果在Spring AOP中必需配置cglib的动态代理,一定要注意