使用MAT来进行java内存问题的简单分析
使用IBM的MAT工具,java内存泄露,内存溢出等问题可以简单的分析出原因。关注点是占内存最多的几个对象,对象实例数最多的几个对象。
原文地址:https://www.cnblogs.com/ken-jl/p/9029057.html
当线上环境出现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文件:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | publicclassOOMTest {    publicstaticvoidmain(String[] args) {        List<Person> list1 = newArrayList<>();        for(Long i = 0L; i < 1000L; i++) {            list1.add(newPerson(i, i.toString(), i.toString()));        }        List<Shop> list2 = newArrayList<>();        for(longi = 0L; i < 256L * 1024L * 1024L; i++) {            list2.add(newShop(i));        }    }    staticclassPerson {        privateLong id;        privateString name;        privateString idcard;        publicPerson(Long id, String name, String idcard) {            this.id = id;            this.name = name;            this.idcard = idcard;        }    }} | 
修改相关参数,这里加上了 -XX:+HeapDumpOnOutOfMemoryError -Xmx256M
 
执行后:

dump下来的hrof文件在项目工程目录下(或指定导出目录:-XX:HeapDumpPath)。
打开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
 
                     
                    
                 
                    
                 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号