Eclipse MAT:浅堆 vs 保留堆

栏目: IT技术 · 发布时间: 5年前

内容简介:Eclipse MAT:浅堆 vs 保留堆

(给ImportNew加星标,提高 Java 技能)

来自:唐尤华

https://dzone.com/articles/eclipse-mat-shallow-heap-retained-heap

有没有想要搞清楚浅堆(Shallow Heap)和保留堆(Retained Heap)之间的区别?


Eclipse MAT(内存分析器工具是功能强大的堆转储分析工具,用来调试与内存相关的问题非常方便。 在 Eclipse MAT 中,会报告两种类型的对象大小:


  1. 浅堆

  2. 保留堆


在本文中,让我们一起研究它们之间的区别,并探索它们是如何计算出来的。


Eclipse MAT:浅堆 vs 保留堆

图1 内存中的对象


通过示例可以更轻松地掌握新概念。假设应用程序有一个对象模型,如图1所示:


  • 对象 A 持有对象 B 和 C 的引用

  • 对象 B 持有对象 D 和 E 的引用

  • 对象 C 持有对象 F 和 G 的引用


假设每个对象占用10个字节的内存。现在,让我们基于这个场景开始研究。


1. 浅堆的大小


记住:对象的浅堆指它在内存中的大小。在示例中,每个对象大约占10个字节,所以每个对象的浅堆大小是10个字节,非常简单。


2. B 的保留堆大小


从图1可以看到,物体 B 持有对物体 D 和 E 的引用。 因此,如果对象 B 从内存中被垃圾回收,那么就不再持有对象 D 和 E 的活动引用。这意味着 D 和 E 也可以被垃圾回收。 保留堆指当特定对象被垃圾回收后即将释放的内存大小。 因此,B 的保留堆大小:

= B 的浅堆大小 + D 的浅堆大小 + E 的浅堆大小
= 10 bytes + 10 bytes + 10 bytes
= 30字节

因此 B 的保留堆大小为30字节。


3. C 的保留堆大小


对象 C 包含对象 F 和 G 的引用,因此,如果对象 C 从内存中被垃圾回收,那么就不再持有对象 F 和 G 的引用。这意味着 F 和 G 也可以被垃圾收集。C 的保留堆大小:

= C 的浅堆大小 + F 的浅堆大小 + G 的浅堆大小
= 10 bytes + 10 bytes + 10 bytes
= 30字节

因此 C 的保留堆大小也是30字节。

Eclipse MAT:浅堆 vs 保留堆

图2 对象浅堆的大小和保留堆大小


4. A 的保留堆大小


对象 A 持有对象 B 和 C 的引用,而对象 B 和 C 又持有对象 D、 E、 F 和 G 的引用,因此,如果对象 A 从内存中被垃圾回收,那么对象 B、 C、 D、 E、 F 和 G 的引用就不存在了。


因此 A 的保留堆大小:


= A 的浅堆大小 + B 的浅堆大小 + C 的浅堆大小 + D 的浅堆大小 + E 的浅堆大小 + F 的浅堆大小 + G 的浅堆大小
= 10 bytes + 10 bytes + 10 bytes + 10 bytes + 10 bytes + 10 bytes + 10 bytes + 10 bytes
= 70字节

这时我们可以得出结论,A 的保留堆大小为70字节。


5. D、 E、 F 和 G 的保留堆大小


D 的保留堆大小为10字节,但这只包括它们的浅堆大小。这是因为 D 不包含任何其他对象的活动引用。因此,如果 D 被垃圾回收,不会从内存中删除任何其他对象。同样道理,E、 F 和 G 的保留堆大小也只有10字节。


6. 让我们把研究变得更有趣


现在,让我们把研究变得更有趣一点,这样能够对浅堆和保留堆大小理解得透彻。在示例中让对象 H 加入对 B 的引用。注意,对象 B 已被对象 A 引用,现在 A 和 H 持有对象 B 的引用。 这种情况下,让我们研究一下保留堆大小会发生什么改变。

Eclipse MAT:浅堆 vs 保留堆

图3 对象 B 的新引用


在这种情况下,对象 A 的保留堆大小将减少到40字节。吃惊不?疑惑吗?

如果对象 A 被垃圾回收,那么将对象 C、 F 和 G 的引用将不复存在。因此,只有对象 C、 F 和 G 会被垃圾回收。另一方面,对象 B、 D 和 E 将继续存在于内存中,因为 H 持有对 B 的活动引用。因此,即使 A 被垃圾回收,B、 D 和 E 也不会从内存中删除。


因此,A 的保留堆大小为:


= A 的浅堆大小 + C 的浅堆大小 + F 的浅堆大小 + G 的浅堆大小
= 10 bytes + 10 bytes + 10 bytes + 10 bytes
= 40字节

A 的总保留堆大小将变为40字节。所有其他对象的保留堆大小保持不变,因为它们的引用没有变化。


希望本文有助于澄清 Eclipse MAT 中浅堆大小和保留堆大小的计算原理。你还可以考虑使用 HeapHero这是另一个强大的堆转储分析工具,它能计算由于不良编程实践浪费的内存大小,像如重复对象、过度分配数据结构且利用不足、数据类型定义不佳等。


看完本文有收获?请转发分享给更多人

关注「ImportNew」,提升Java技能

Eclipse MAT:浅堆 vs 保留堆

喜欢就点「好看」呗~


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

区块链核心算法解析

区块链核心算法解析

【瑞士】Roger Wattenhofer(罗格.瓦唐霍费尔) / 陈晋川、薛云志、林强、祝庆 / 电子工业出版社 / 2017-8 / 59.00

《区块链核心算法解析》介绍了构建容错的分布式系统所需的基础技术,以及一系列允许容错的协议和算法,并且讨论一些实现了这些技术的实际系统。 《区块链核心算法解析》中的主要概念将独立成章。每一章都以一个小故事开始,从而引出该章节的内容。算法、协议和定义都将以形式化的方式描述,以便于读者理解如何实现。部分结论会在定理中予以证明,这样读者就可以明白为什么这些概念或算法是正确的,并且理解它们可以确保实现......一起来看看 《区块链核心算法解析》 这本书的介绍吧!

SHA 加密
SHA 加密

SHA 加密工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

html转js在线工具
html转js在线工具

html转js在线工具