CGLIB动态代理对象GC问题排查 | 京东云技术团队
💡
原文中文,约1500字,阅读约需4分钟。
📝
内容提要
最近完成了一个新系统的开发,对核心接口进行了压力测试,发现核心接口的QPS只有200左右,CPU却飙升到了100%。经过定位发现,是由于Finalizer线程频繁执行垃圾回收导致CPU资源被抢占。解决方案包括不使用CGLIB创建动态代理,手动创建静态代理类,以及尽量减少临时对象的产生。
🎯
关键要点
- 新系统开发完成后进行压力测试,核心接口QPS仅200,CPU使用率达到100%。
- 压测容器配置为4C8G,初始并发为10个,CPU迅速飙升。
- 观察到JVM的垃圾回收频繁,younggc频率高但fullGC为零。
- 通过top命令定位到Java应用进程,进一步分析线程使用情况。
- 定位到Finalizer线程,该线程负责处理等待垃圾回收的对象。
- Finalizer线程频繁工作是由于大量通过CGLIB创建的动态代理对象未被及时回收。
- 解决方案包括:不使用CGLIB创建动态代理,手动创建静态代理类,减少临时对象的产生。
➡️