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创建动态代理,手动创建静态代理类,减少临时对象的产生。
➡️

继续阅读