昨天遇到了内存溢出,之前看过java虚拟机,还记得dump和MAT以及大概的定位方法(虽然没用过)。于是,开始。
1. 下载MAT,地址:http://www.eclipse.org/mat/downloads.php
选择自己需要的版本,下载前可以选择比较近的镜像,可以提高下载速度:
2. 下载后解压,结构如下(我的是win64):
3. 设置虚拟机参数为:-Xmx40m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=E:\Java\dump。当出现内存溢出时,会在指定的目录生成dump文件
4. 打开MAT,打开菜单:File -> Open Heap Dump,选择dump文件(右下角的过滤器,需要设置为ALL Files才能看到dump文件)
这里我用的默认选项,点'Finish'
MAT打开dump的过程中会占用大量内存(dump文件都很大,比如我这次的就是4G左右),如果分配的内存不够,那么打开过程可能会失败。这里需要修改MAT的内存。
MAT其实是eclipse的插件,就算独立运行的MAT,根目录下也有一个‘eclipse.exe’文件。所以,修改内存的方式应该和eclipse一样。于是看到了‘MemoryAnalyzer.ini’文件,打开后有一个配置‘-Xmx1024m’,这不是JVM参数吗: ) 。 改大一点,就OK
5. 打开后,MAT会对dump进行分析,这个过程请等待,结束后会生成一个报表。根据报表能看出内存占用前几位的实例。效果图
报表下方根据占用内存大小,依次列出了粗略信息,点击‘detail’链接,可以查看该实例的详细信息
也可以打开‘dominator_tree’查看实例的内存使用情况(单位:byte)
或者点击‘Overview’视图的饼图,选择‘List objects > with outgoing references’,打开的视图中可以看到很多信息,需要耐心分析。
6. 难得的一次线上环境的内存溢出,可以给我学习内存分析。以前虽然看过书,但没实际操作过,总觉得心里没底。总之,开心!