天天看点

内存泄漏分析 GC overhead limit exceeded

【现象】Tomcat日志报:java.lang.Exception: java.lang.OutOfMemoryError: GC overhead limit exceeded

【解决方法】通过MAT分析dump文件

1、jmap生成dump文件

jmap -dump:live,file=dump.hprof 267596

2、MAT分析dump文件

dump出来的文件有8个多G,由于本人的windows机器只有4G内存,在windows上加载dump文件会报错。要分析dump文件需要一台内存大于dump文件大小的机器。找到一台内存大于8G的linux机器,在linux进行dump文件分析。

  • 下载MemoryAnalyzer-1.9.0.20190605-linux.gtk.x86_64.zip
  • unzip MemoryAnalyzer-1.9.0.20190605-linux.gtk.x86_64.zip #解压
  • vim MemoryAnalyzer.ini #修改配置文件
-Xmx10240m #由dump文件大小决定 
  • ./ParseHeapDump.sh dump.hprof  org.eclipse.mat.api:suspects org.eclipse.mat.api:overview org.eclipse.mat.api:top_components

8G的dump文件分析起来还是需要很久时间的

3、 查看生成的报告

查看报告有两种方式,浏览器方式、eclipse方式。

  • 浏览器方式

将dump_Leak_Suspects.zip文件拷贝出来,解压,点击页面浏览。只能看个大概,无法跳转进一步分析。

内存泄漏分析 GC overhead limit exceeded
  • eclipse方式
内存泄漏分析 GC overhead limit exceeded

list objects->with outgoing references

内存泄漏分析 GC overhead limit exceeded

4、分析代码

List<TableInfo> tableInfoList = tableInfoMap.getOrDefault(userIndexName, new ArrayList<>());
tableInfoList.add(tableInfo);
tableInfoMap.put(userIndexName, tableInfoList);
           

继续阅读