MAT

Memory Analyzer Tool

这是一款功能强大的java堆内存分析器,可以用于查找内存泄漏以及查看内存的消耗情况






mat打开hprof的时候


第一个就是进行内存泄漏的分析,第二个是组件分析(啥意思),第三个是重新打开(如果之前生成过的话)



这里展示的应该不是dump文件的大小,而是dump文件中,内存映射的总大小。



从上到下是 对象的数量的直方图,分配树(对象的关联关系),列举对象的大小顺序,分析重复类加载



mat的直方图分析GC ROOTS ,并且可以分析对象除掉一些虚,若,软引用之外的GC ROOTS。


在线程相关的信息里面分析出引用和入引用判断对象的状态

出引用,被该对象引用的对象

入引用,引用类该对象的对象



垃圾回收中,关于浅堆和深堆的概念


浅堆

浅堆表示的是这个对象自身消耗的内存,在不同位数的操作系统中,占用的字节数会有差异


举个例子:

一个String对象,对象中有int类型的hash32和int类型的hash,这两个int类型占据八个字节,然后一个char[]数组 value,引用类型在32位操作系统占据4个字节。对象头在32位系统占据8字节。所以这个对象一共是20字节,不过对象的大小需要像8字节靠拢,所以是24字节。所以String对象的浅堆大小都是24字节,无论你的String对象有多长,浅堆都是24字节。


深堆

在讲深堆之前,还得讲个概念叫做保留集(只能被该对象直接或者间接访问到的,除此之外,不能被访问到的)

深堆的大小就是所有保留集的对象的浅堆之和。即对象被回收之后,能释放真实空间


举个例子

假设两个String ,他们的value指向的是字符串常量池的同一个字符串,那么在计算这个String的深堆的时候就不能计算这个value的字节数

比如ObjectA和ObjectB,ObjectA持有ObjectB的引用,并且没有别的对象能访问到ObjectB。

那么ObjectA的深堆大小就是ObjectA和ObjectB的浅堆之和。


另外我们熟悉的一个概念,对象实际大小



支配树的概念


在对象引用图中,假设所有指向B的路径都要经过A,那么就认为A支配了B,如果A是B最近的一个支配折,那么就认为A是B的直接支配者

支配树有以下特征:

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容