【現象】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檔案拷貝出來,解壓,點選頁面浏覽。隻能看個大概,無法跳轉進一步分析。
- eclipse方式
list objects->with outgoing references
4、分析代碼
List<TableInfo> tableInfoList = tableInfoMap.getOrDefault(userIndexName, new ArrayList<>());
tableInfoList.add(tableInfo);
tableInfoMap.put(userIndexName, tableInfoList);