频繁FullGC的原因竟然是“开源代码”? | 京东云技术团队
💡
原文中文,约7800字,阅读约需19分钟。
📝
内容提要
本文主要讲述了Java语言的特性和垃圾回收机制,以及频繁Full GC的问题。通过分析JVM参数、Tomcat参数、堆栈文件和代码,发现内存泄漏的原因是每个线程中存储了大量的SessionInMemory对象,导致内存占用过高。解决方案包括删除过期的Session、取消ThreadLocal策略、使用本地缓存和减少Tomcat的核心线程数。最终,作者定位到问题的根本原因是shiro-redis组件的版本问题,升级到3.2.3版本后解决了该问题。文章还总结了在报警前后应该注意的事项和收获。
🎯
关键要点
-
Java语言具有自动垃圾回收机制,避免内存泄漏。
-
Full GC会导致系统所有线程停止,需尽量减少其发生。
-
项目使用shiro框架进行权限控制,shiro-redis组件引发内存泄漏。
-
监控系统报警显示频繁Full GC,采取措施收集证据。
-
分析JVM参数和Tomcat参数,排除多种可能导致Full GC的原因。
-
最终确认内存泄漏源于ThreadLocal中存储大量SessionInMemory对象。
-
SessionInMemory对象处理不当导致内存占用过高,频繁触发Full GC。
-
升级shiro-redis组件至3.2.3版本解决内存泄漏问题。
-
提出四种解决方案,选择方案1和方案4进行实施。
-
总结经验教训,强调监控和分析工具的重要性。
➡️