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的直接支配者
支配树有以下特征: