MAT是Memory Analyzer的简称,它是一款功能强大的Java堆内存分析器。用于查找内存泄漏以及查看内存消耗情况。

    MAT是基于Eclipse开发的,是一款免费的性能分析工具。

    http://www.eclipse.org/mat/可下载并使用MAT。

使用MAT做jvm的GC Roots溯源_应用程序

使用MAT

1.获取dump文件(bin文件)

方式一:命令行使用jmap

 使用MAT做jvm的GC Roots溯源_应用程序_02


方式二:使用JVisualVM导出

    捕获的heap dump文件是一个临时文件,关闭JVisualVM后自动删除,若要保留,需要将其另存为文件。

    可通过以下方法捕获heap dump:

        在左侧“Application”(应用程序)子窗口中右击相应的应用程序,选择Heap Dump(堆Dump)。

        在Monitor(监视)子标签页中点击Heap Dump(堆Dump)按钮。

    本地应用程序的Heap dumps作为应用程序标签页的一个子标签页打开。同时,heap dump在左侧的Application(应用程序)栏中对应一个含有时间戳的节点。右击这个节点选择save as(另存为)即可将heap dump保存到本地。

获取以下代码的两次堆dump:

使用MAT做jvm的GC Roots溯源_应用程序_03


2.使用AMT

file->openFile->打开对dump文件。

使用MAT做jvm的GC Roots溯源_应用程序_04

 使用MAT做jvm的GC Roots溯源_应用程序_05

 使用MAT做jvm的GC Roots溯源_标签页_06

 在Thread->java.lang.Thread->main线程中,我们可以发现,在将对象置为null前,有Date和ArrayList类型的GC Roots,置为null后就没有了。