天天看點

記憶體洩漏分析 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);
           

繼續閱讀