MAT 是什么?
MAT 是 Memory Analyzer 的简称,它是一款功能强大的 Java 堆内存分析器。用于查找内存泄漏以及查看内存消耗情况。
MAT 是基于 Eclipse 开发的,是一款免费的性能分析工具。
大家可以在 http://www.eclipse.org/mat/ 下载并使用 MAT
获取 dump 文件
方式一:命令行使用 jmap
方式二:使用 JVisualVM 导出
捕获的 heap dump 文件是一个临时文件,关闭 JVisualVM 后自动删除,若要保留,需要将其另存为文件。
可通过以下方法捕获 heap dump:
-
在左侧“Application"(应用程序)子窗口中右击相应的应用程序,选择 Heap Dump(堆 Dump)。
-
在 Monitor(监视)子标签页中点击 Heap Dump(堆 Dump)按钮。
本地应用程序的 Heap dumps 作为应用程序标签页的一个子标签页打开。同时,heap dump 在左侧的 Application(应用程序)栏中对应一个含有时间戳的节点。
右击这个节点选择 save as(另存为)即可将 heap dump 保存到本地。
方式三:使用 MAT 打开 Dump 文件
JProfiler 的 GC Roots 溯源
(本身这个对象我已经不想用它了,它已经不再会被使用了,它就是垃圾,但是当我们用Class分析算法时,会发现,它直接或间接地还被GC Roots关联着,导致还没办法将它GC,这就是java真正的内存泄露。那出现内存泄漏, 我们可以溯源,发现它确实和GC Roots连上了,那可以在适当的位置给它断开。所以我们在开发中,一般都会看某个对象上的GC Roots是什么,这就是GC Roots溯源)
我们在实际的开发中,一般不会查找全部的 GC Roots,可能只是查找某个对象的整个链路,或者称为 GC Roots 溯源,这个时候,我们就可以使用 JProfiler
view --> Mark Current Values
可以将当前对象基于当前节点后的个数的变化的值展现出来,便可以看到有哪些对象变化比较大,变化比较大的就是我们要关注的一些对象了。
对象个数比较大或是说占用空间比较大,当我们GC(点击Run GC)的时候,我们还始终回收不了它们
我们发现char数组对象比较多,我们可以鼠标指着-->点右键-->Show Selection In Heap Walker--> ok
分配,大对象,相关引用。我们更关注的是引用,引用用得比较多
点击References之后,就可以看到所有的参数。想知道有哪些有内存泄漏问题,就可以做GC Roots溯源
Outgoing references:定位代码的大概位置
Incoming references:判断和哪个GC Roots是相关联的