利用Eclipse对MAT进行分析解决JAVA内存问题

*爱你&永不变心* 提交于 2019-11-29 23:56:35

   我们在开发过程中往往会遇到 java.lang.OutOfMemoryError: Java heap space或者stackoverflow 这样或那样内存不够的错误。这种错误在开发人员对jvm里面的一些机制不清楚的情况下经常是摸不着头脑。下面的工具可以清楚比较直观的了解我们运行的程序在jvm里面所存在的区和每个属性所占jvm的大小<根据系统版本不同所占大小也不同>。

    下面的介绍是Eclipse官方的介绍.

Memory Analyzer (MAT)

  1. The Eclipse Memory Analyzer is a fast and feature-rich Java heap analyzer that helps you find memory leaks and reduce memory consumption.
  2. Use the Memory Analyzer to analyze productive heap dumps with hundreds of millions of objects, quickly calculate the retained sizes of objects, see who is preventing the Garbage Collector from collecting objects, run a report to automatically extract leak suspects.

      官方说MAT是一款快速,功能丰富的Java堆分析仪,可以帮助你查找内存泄漏和减少内存消耗。可以对象大小并且生成报告。

       官方地址:http://www.eclipse.org/mat/

安装方式:

  1. 可以从官网上下载对应系统的zip包。然后通过eclipse的安装插件的方式进行安装
  2. 可以从更新插件的方式进行安装。直接在eclipse里面输入地址。地址是:http://download.eclipse.org/mat/1.3/update-site/

以上两种方式我想每一个用eclipse做ide的程序员都会用吧。固我就不把安装插件的方法写在文章里了。不懂可以google。

接下来是重点:

  1. 先运行你的程序。
  2. 然后用jdk提供的命令查找到运行程序的进程
        jps命令。如果觉得jps显示的信息太少可以加参数:
    jps  -q  只输出LVMID,省略主类的名称
    jps  -m 输出虚拟机进程启动时传递给主类main()函数的参数
    jps  -l   输出主类的全名,如果进程执行的是jar包,则输出jar包路径。
    jps  -v  输出虚拟机进程启动时JVM参数

    5600就是我刚刚运行程序的进程。

  3. 执行 jmap -dump:format=b,file=heap.bin 5600 命令。会在当前目录下生成一个heap.bin的文件。此文件可以在file=xxx 修改。
  4. 然后打开eclipse。用file  -> open file 打开这个文件。就可以看到下面的报告了。


       我们来看几个比较常用的报表

      Histogram:查看每个类的实例数量。见下图
        从这个图可以很直观的看出来每一个在heap区中的实例数量

         Dominator Tree:系统中比较大的对象还存活的对象
       

    从上图可以看出每个线程这几个线程所占的内存比较大在线程栈比较大。
    我就不一个个的介绍了。大家可以自己去试试。

    当然这只是查看内存情况的某一个工具。还有其他比较优秀的工具比如jvisualvm、jprofiler 等等。这个因人而异。


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!