昨天遇到了内存溢出,之前看过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. 难得的一次线上环境的内存溢出,可以给我学习内存分析。以前虽然看过书,但没实际操作过,总觉得心里没底。总之,开心!

更多相关文章

  1. APNS开源包的内存泄露问题
  2. JAVA环境下创建JSP文件报错: The superclass "javax.servlet.http
  3. 【JavaWeb-6】HttpServletResponse的字符字节输出流、编码、文件
  4. Java 简单解决springmvc获取properties文件里面中文内容出现论码
  5. 解决Eclipse建立Maven项目后无法建立src/main/java资源文件夹的
  6. Java对象创建的过程及对象的内存布局与访问定位
  7. Java并发编程(四)Java内存模型
  8. java内存垃圾回收模型
  9. java读写中文文件

随机推荐

  1. spring boot返回date类型
  2. 跨站脚本专题(XSS)
  3. JavaScript三种弹出框(alert,confirm和prom
  4. 是否有缩放因子方法用于Android的多分辨
  5. 黑马程序员 Java中根据YYYY-MM-DD格式的
  6. 用java画跳棋棋盘
  7. 【Effective Java】条30:使用枚举代替int
  8. java中excel导出包括合并单元格和单元格
  9. java中jar包的使用
  10. 关于String、集合、数组的长度