写点什么

JVM 诊断工具中的深堆、浅堆、支配树,你都明白吗

作者:JAVA旭阳
  • 2022-10-14
    浙江
  • 本文字数:1383 字

    阅读完需:约 5 分钟

JVM诊断工具中的深堆、浅堆、支配树,你都明白吗

概述

大家在用 jvm 诊断工具,比如 Eclipse MAT 或者 Jprofiler 分析堆内存的时候,都会看到一些概念或者关键词,如 Shallow Heap, Retained Heap, Dominator Tree 等,你们知道他们是干嘛的吗?


Eclipse MAT 相关截图:




jprofile 相关截图:




虽然上面两个工具有点差异,但是他们表达的都是同一个意思。

浅堆(Shallow Heap、Shallow Size)

浅堆是指一个对象所消耗的内存。在 32 位系统中,一个对象引用会占据 4 个字节,一个 int 类型会占据 4 个字节,long 型变量会占据 8 个字节,每个对象头需要占用 8 个字节。根据堆快照格式不同,对象的大小可能会同 8 字节进行对齐。


以 jdk7 中 String 为例:2 个 int 值共占 8 字节,对象引用占用 4 字节,对象头 8 字节,合计 20 字节,向 8 字节对齐,故占 24 字节。



这 24 字节为 String 对象的浅堆大小。它与 String 的 value 实际取值无关,无论字符串长度如何,浅堆大小始终是 24 字节。

深堆(Retained Heap、Retained Size)

这里引入一个保留集(Retained Set)的概念,什么是保留集呢? 当对象 A 被垃圾回收后,可以被释放的所有的对象集合(包括对象 A 本身),即对象 A 的保留集可以被认为是只能通过对象 A 被直接或间接访问到的所有对象的集合。通俗地说,就是指仅被对象 A 所持有的对象的集合。


深堆是指对象的保留集中所有的对象的浅堆大小之和,也就是从堆中移除这个实例将释放的内存量。


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



举个例子:对象 A 引用了 C 和 D,对象 B 引用了 C 和 E。对象 A 的浅堆大小只是 A 本身,A 的深堆大小为 A 与 D 之和,因为对象 C 还可以被对象 B 访问,所以不在对象 A 的深堆范围之内。那 A 的实际大小是多大呢?在日常开发中,A 对象的实际大小是 A,C,D 相加的大小。 所以说,浅堆、深堆、实际大小都是不一样的。

支配树(Dominator Tree)

支配树可以用来显示堆转储中最大的对象。树的下一层列出了如果删除对父节点的所有传入引用将被垃圾回收的对象。


支配树是一个强大的工具,用于研究哪些对象保持哪些对象存活。同样,可以根据类装入器(例如组件)和包对树进行分组,以简化分析。


那究竟什么是支配树呢?


在对象引用图中,所有指向对象 B 的路径都经过对象 A,则认为对象 A 支配对象 B。如果对象 A 是离对象 B 最近的一个支配对象,则认为对象 A 为对象 B 的直接支配者。支配树是基于对象间的引用图所建立的。


举个例子:



左图表示对象引用图,右图表示左图所对应的支配树。


  • 对象 A 和 B 由根对象直接支配,由于在到对象 C 的路径中,可以经过 A,也可以经过 B,因此对象 C 的直接支配者也是根对象。

  • 对象 F 与对象 D 相互引用,因为到对象 F 的所有路径必然经过对象 D,因此,对象 D 是对象 F 的直接支配者。

  • 而到对象 D 的所有路径中,必然经过对象 C,即使是从对象 F 到对象 D 的引用,从根节点出发,也是经过对象 C 的,所以,对象 D 的直接支配者为对象 C。

  • 同理,对象 E 支配对象 G。到达对象 H 的可以通过对象 D,也可以通过对象 E,因此对象 D 和 E 都不能支配对象 H。

  • 经过对象 C 既可以到达 D 也可以到达 E,因此对象 C 为对象 H 的直接支配者。

总结

本文总结了 jvm 诊断工具比如 jprofiler、eclipse mat 等一些共通的概念,希望对大家有帮助。

参考

https://www.ej-technologies.com/resources/jprofiler/v/11.0/help/doc/main/heapWalker.html

http://help.eclipse.org/latest/index.jsp?topic=/org.eclipse.mat.ui.help/welcome.html

发布于: 刚刚阅读数: 6
用户头像

JAVA旭阳

关注

还未添加个人签名 2018-07-18 加入

还未添加个人简介

评论

发布
暂无评论
JVM诊断工具中的深堆、浅堆、支配树,你都明白吗_Java_JAVA旭阳_InfoQ写作社区