Jmap 是一个可以输出所有内存中对象的工具,甚至可以将VM 中的heap,以二进制输出成文本。
1.首先安装Eclipse环境:
2.为Eclipse安装插件MAT:
(1)运行
(3)选择“Available Software“,然后,添加更新地址: http://download.eclipse.org/mat/1.2/update-site/
(4)接下来选择你想要安装的 MAT 的功能点,需要注意的是 Memory Analyzer (Chart)这个功能是一个可选的安装项目,它主要用来生成相关的报表,不过如果需要用到这个功能,你还需要额外的安装 BIRT ChartEngine。
(5)插件安装完毕,重新启动 Eclipse 的工作平台。
3.使用MAT生成内存泄漏分析报告:
(1)通过jmap命令生成堆存储文件:jmap -F -dump:file=wxh.dmp[pid] //其中,wxh.dmp就是生成的堆存储文件。
(2)打开MemoryAnalyzer tool,然后选择菜单项 File- Open Heap Dump 来加载需要分析的堆转储文件。
(3)加载完成后,就可以点击工具栏上的 Leak Suspects 菜单项来生成内存泄露分析报告了。
4.那么,如何根据分析报告来分析内存的泄漏情况呢?
(1)查看内存消耗的整体情况
重点关注消耗内存最大的可疑对象。比如,是哪个类占用了绝大多数的内存,它属于哪个组件等等。
(2)分析问题所在
首先我们简单回顾下JAVA 的内存回收机制,内存空间中垃圾回收的工作由垃圾回收器 (Garbage Collector,GC)完成的,它的核心思想是:对虚拟机可用内存空间,即堆空间中的对象进行识别,如果对象正在被引用,那么称其为存活对象,反之,如果对象不再被引用,则为垃圾对象,可以回收其占据的空间,用于再分配。
在垃圾回收机制中有一组元素被称为根元素集合,它们是一组被虚拟机直接引用的对象,比如,正在运行的线程对象,系统调用栈里面的对象以及被system class loader所加载的那些对象。堆空间中的每个对象都是由一个根元素为起点被层层调用的。因此,一个对象还被某一个存活的根元素所引用,就会被认为是存活对象,不能被回收,进行内存释放。因此,我们可以通过分析一个对象到根元素的引用路径来分析为什么该对象不能被顺利回收。如果说一个对象已经不被任何程序逻辑所需要但是还存在被根元素引用的情况,我们可以说这里存在内存泄露。
现在,让我们开始真正的寻找内存泄露之旅,点击“Details ”链接,可以看到对可疑对象的详细分析报告。
(1)查看下从 GC根元素到内存消耗聚集点的最短路径;
这时,可以很清楚的看到整个引用链,内存聚集点是一个拥有大量对象的集合,如果你对代码比较熟悉的话,相信这些信息应该能给你提供一些找到内存泄露的思路了。
(2)接下来,再继续看,这个对象集合里到底存放了什么,为什么会消耗掉如此多的内存。
(3)至此,根据已经拥有的关于泄露点的信息,回到代码,找出是哪一段代码最终导致了内存泄露。
sudo apt-getinstall eclipse
eclipse.
(2)
通过 Help -> Software Updates...启动软件更新管理向导。