MAT(Memory Analyzer tool)使用
當線上環境出現OOM/內存泄漏了,怎麽辦?
讓虛擬機在發生內存溢出時 Dump 出當前的內存堆轉儲快照,配置-XX:+HeapDumpOnOutOfMemoryError,
當出現OOM時,分析dump下來的hprof文件,一般使用MAT輔助查看。
安裝方式:
1 eclipse安裝MAT插件;安裝說明:https://www.ibm.com/developerworks/cn/opensource/os-cn-ecl-ma/index.html
2 獨立版本(建議),下載地址:http://www.eclipse.org/mat/downloads.php,下載解壓後就可以直接用。
分析一個堆轉儲文件需要消耗堆空間,需要分配內存,
MemoryAnalyzer.ini中的參數一般默認為-vmargs– Xmx1024m;
當dump文件的大小大於配置的1024m,會報錯;
方式1:修改啟動參數 MemoryAnalyzer.exe-vmargs -Xmx4g
方式2:編輯文件 MemoryAnalyzer.ini,修改/添加參數 -vmargs– Xmx4g
模擬產生hprof文件:
public class OOMTest { public static void main(String[] args) { List<Person> list1 = new ArrayList<>(); for (Long i = 0L; i < 1000L; i++) { list1.add(new Person(i, i.toString(), i.toString())); } List<Shop> list2 = new ArrayList<>(); for (long i = 0L; i < 256L * 1024L * 1024L; i++) { list2.add(new Shop(i)); } } static class Person { private Long id; private String name; private String idcard; public Person(Long id, String name, String idcard) { this.id = id; this.name = name; this.idcard = idcard; } } }
修改相關參數,這裏加上了 -XX:+HeapDumpOnOutOfMemoryError -Xmx256M
執行後:
dump下來的hrof文件在項目工程目錄下。
打開MAT工具,File >> Open Heap Dump...
通過分析結果,很容易知道哪些對象占用了大量的堆內存。
MAT會把分析結果打包成zip包,解壓後通過瀏覽器就可以訪問。
打開對象依賴關系樹形視圖
相關鏈接:
http://seanhe.iteye.com/blog/898277
http://www.blogjava.net/rosen/archive/2010/06/13/323522.html
https://blog.csdn.net/rachel_luo/article/details/8992461
MAT(Memory Analyzer tool)使用