Java优化知行合一(2):基于MAT的内存泄露排查案例
发布网友
发布时间:2024-10-23 23:46
我来回答
共1个回答
热心网友
时间:2天前
在Java优化的系列中,我们来到了第二部分:基于MAT的内存泄露排查案例。MAT,全称为Memory Analyzer Tools,是一个强大的Java堆内存分析工具,由Eclipse提供,用于线下问题的诊断和追踪。它能轻松导入mp文件,一键进行深度分析,对内存泄露、GC分析和代码优化都有显著帮助。
一次实战中,我收到一个1G多的内存mp文件,一位同事焦急地表示项目线上出现了堆空间OOM,怀疑是内存泄露问题。内存泄露问题往往有两种情况:一是显而易见,一眼就能发现;二是隐藏很深,让人费尽心思。我利用MAT加载mp,点击Leak Suspects,立即显示出异常信息,但其中的代理类实例和ConcurrentHashMap的大小让我们疑惑不解。
通过查找原始类型,我们发现Proxy202是一个被service引用的Mapper,却占据了大量空间。深入调查,Proxy202内部包含了大量JPA对象,尤其是ConcurrentHashMap中存储的388304个node。进一步追踪,这个ConcurrentHashMap实际上是查询缓存,而问题出在spring-data-jpa的缓存实现中,由于ParameterMetadata的equals和hashCode问题,导致内存无法回收,造成了内存泄露。
幸运的是,妹子提供了项目的Spring Boot和JPA版本信息,确认为2.2.2,正是问题所在。解决方法是升级至Spring Boot 2.3以上版本,以修复该问题。MAT中的工具如直方图、Shallow Heap和Retained Heap,以及Dominator Tree、outgoing/incoming references和shortest paths to GC Roots,都是我们在排查过程中不可或缺的分析工具,它们帮助我们理解内存占用的细节,有效定位和解决问题。