(JVM)MAT 与 JProfiler 的 GC Roots 溯源

MAT 是什么?

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

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

大家可以在 http://www.eclipse.org/mat/ 下载并使用 MAT

获取 dump 文件

方式一:命令行使用 jmap

image-20210512105418987

方式二:使用 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是相关联的

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值