内容简介:Eclipse MAT:浅堆 vs 保留堆
(给ImportNew加星标,提高 Java 技能)
来自:唐尤华
https://dzone.com/articles/eclipse-mat-shallow-heap-retained-heap
有没有想要搞清楚浅堆(Shallow Heap)和保留堆(Retained Heap)之间的区别?
Eclipse MAT(内存分析器工具)是功能强大的堆转储分析工具,用来调试与内存相关的问题非常方便。 在 Eclipse MAT 中,会报告两种类型的对象大小:
浅堆
保留堆
在本文中,让我们一起研究它们之间的区别,并探索它们是如何计算出来的。
图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字节。
图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 的引用。 这种情况下,让我们研究一下保留堆大小会发生什么改变。
图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技能
喜欢就点「好看」呗~
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- ios – 阻止递归和打破保留周期
- 正则表达式判定保留2位小数的实现代码
- php合并数组并保留键值的实现方法
- Chrome 69 清空 Cookies 会保留 Google 的 Cookies
- Windows 画图应用 MSPaint 仍保留在 Windows 10 中
- [译] Python 为什么要保留显式的 self?
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Agile Web Application Development with Yii 1.1 and PHP5
Jeffrey Winesett / Packt Publishing / 2010-08-27
In order to understand the framework in the context of a real-world application, we need to build something that will more closely resemble the types of applications web developers actually have to bu......一起来看看 《Agile Web Application Development with Yii 1.1 and PHP5》 这本书的介绍吧!