JVM 内存分析

1、MAT 简介

MAT是一款非常强大的内存分析工具,只要获得了反映当前设备内存映像的hprof文件,通过MAT打开就可以直观地分析jvm内存信息。

2、安装和设置

  下载地址

    Eclipse Memory Analyzer Open Source Project | The Eclipse Foundation

  安装遇到的坑m1 芯片下安装可能不成功,可以使用其他人安装好的,从应用程序中压缩的mat 文件(已经上传到 10.110.6.24 /data/mat.app.zip )(吝哲解决过)

  配置mat 堆内存大小    修改配置文件 /Applications/mat.app/Contents/Eclipse/MemoryAnalyzer.ini

3、生成并下载堆文件 (生成后请压缩后再下载)

jmap -dump:live,format=b,file=heap***.hprof pid

4、使用 mat 查看堆文件信息

用MAT打开一个hprof文件后一般会进入如下的overview界面,overview界面会以饼图的方式显示当前消耗内存最多的几类对象,可以使我们对当前内存消耗有一个直观的印象。

1)Histogram (柱状图)

通过柱状图界面,可以查找引用选中对象的对象集合以及选中对象所引用的对象集合。

2)Dominator Tree (支配树)  支配树可以直观地反映一个对象的retained heap,这里我们首先要了解两个概念,shallow heap和retained heap:

  • shallow heap:指的是某一个对象所占内存大小。
  • retained heap:指的是一个对象的retained set所包含对象所占内存的总大小。

  浅堆指对象本身占用的内存,不包括其内部引用对象的大小。一个对象的深堆指只能通过该对象访问到的(直接或间接)所有对象的浅堆之和,即对象被回收后,可以释放的真实空间。

  支配树体现了对象实例间的支配关系。在对象引用图中,所有指向对象B的路径都经过对象A,则认为对象A支配对象B。如果对象A是离对象B最近的一个支配对象,则认为对象A为对象B的直接支配者。支配树是基于对象间的引用图所建立的,它具有以下基本性质:

  • 对象A的子树(所有被对象A支配的对象集合)表示对象A的保留集(retainedset)。
  • 如果对象A支配对象B,那么对象A的直接支配者也支配对象B。
  • 支配树的边与对象引用图的边不直接对应。

  下图中左图表示对象引用图,右图表示左图所对应的支配树。对象A和B由根对象直接支配,由于在到对象C的路径中可以经过A,也可以经过B,因此对象C的直接支配者也是根对象。对象F与对象D相互引用,因为到对象F的所有路径必然经过对象D,因此对象D是对象F的直接支配者。而到对象D的所有路径中,必然经过对象C,即使是从对象F到对象D的引用,从根节点出发,也是经过对象C的,所以对象D的直接支配者为对象C。

3)OQL(Object Query Language)

4)Leak Suspects(内存泄漏检测)

MAT提供了自动检测内存泄漏,以及统计堆快照内对象分布情况的工具。下图展示了内存泄漏检测工具的使用方法。选择菜单中的Leak Suspects命令,MAT会自动生成一份报告。这份报告罗列了系统内可能存在内存泄漏的问题点(一般情况下解决这些 Problem 就可以了)。

5)Top Comment 最大对象报告

系统中占用内存最大的几个对象,往往是解决系统性能问题的关键所在。如果应用程序发生内存泄漏,那么泄漏的对象通常会在堆快照中占据很大的比重。因此,查看和分析堆快照中最大的对象具有较高的价值。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林中山野

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值