有没有想过 Shallow 和 Retained heap 之间的区别?

Eclipse MAT(内存分析器工具)是分析 JVM 堆 Dump 文件的强大工具。当尝试分析内存相关的问题时,它非常方便。在 Eclipse MAT 内存分析的报告中会显示对象两种类型的 Heap 信息:

  1. Shallow Heap
  2. Retained Heap

在本文中,我们主要讨论它们之间的区别,并探讨它们的计算方式。

通过示例理解知识会更容易,咱们来看看这样一个例子。例如,假设你的应用程序具有这样的对象模型,如图 1 所示:

图1:内存中的对象

  • 对象 A 持有对象 B 和 C 的引用。
  • 对象 B 持有对象 D 和 E 的引用。
  • 对象 C 持有对象 F 和 G 的引用。

另外,我们假设每个对象占用 10 个字节的内存。在这种场景下,我们来开始分析吧。

Shallow Heap 大小

请记住:对象的 Shallow heap 是其自身在内存中的大小。由于在我们的示例中,每个对象占用大约 10 个字节,因此每个对象的 Shallow heap 大小为 10 个字节。很简单。

B 的 Retained Heap 大小

从图 1 中,您可以注意到对象 B 持有对象 D 和 E 的引用。因此,如果对象 B 是从内存中被垃圾回收,则将不再有对对象 D 和 E 的引用。这意味着此时 D 和 E 也可以被垃圾收集。Retained heap 指的就是在垃圾回收特定对象时将释放的内存量。因此,B 的保留堆大小为:= B 的 shallow heap 大小 + D 的 shallow heap 大小 + E 的 shallow heap 大小 = 10 bytes + 10 bytes + 10 bytes = 30 bytes

因此,B 对象的 Retained heap 大小为 30 字节

C 的 Retained Heap 大小

对象 C 拥有对象 F 和 G 的引用。如果对象 C 是从内存中垃圾回收的,将不再持有对对象 F 和 G 的引用。这意味着此时 F 和 G 也可以被垃圾回收。因此,C 的 Retained Heap 大小为:= C 的 shallow heap 大小 + F 的 shallow heap 大小 + G 的 shallow heap 大小 = 10 bytes + 10 bytes + 10 bytes = 30 bytes

因此,C 对象的 Retained heap 大小为 30 字节

A 的 Retained Heap 大小

对象 A 持有对象 B 和 C 的引用,而对象 B 和 C 又持有对对象 D、E 以及 F、G 的引用。因此,如果对象 A 是从内存中垃圾回收的,则将不再有对 B、C、D、E、F 和 G 对象的引用。基于此理解,我们来计算下 A 的 Retained Heap 大小。A 的 Retained Heap 大小为:= A 的 shallow heap 大小 + B 的 shallow heap 大小 + C 的 shallow heap 大小 + D 的 shallow heap 大小 + E 的 shallow heap 大小 + F 的 shallow heap 大小 + G 的 shallow heap 大小 = 10 bytes + 10 bytes + 10 bytes + 10 bytes + 10 bytes + 10 bytes + 10 bytes = 70 bytes

最后我们可以得出,A 的 Retained heap 大小是 70 字节。

D、E、F、G 的 Retained Heap 大小

D 的 Retained heap 大小与其 Shallow heap 大小相同,就是 10 个字节,因为 D 不持有对任何其他对象的引用。因此,如果 D 获得了垃圾回收,则不会从内存中删除其他的任何对象。同理,E、F 和 G 的 Retained heap 大小也只有 10 个字节。

图 2:对象的 Shallow and Retained Heap 大小

咱们再来点更有趣的吧

现在,让我们的来点更加有趣的吧,以便让你对 Shallow heap 和 Retained heap 有更加透彻的了解。在下面的示例中,让对象 H 开始持有对 B 的引用。注意对象 B 已经被对象 A 引用了。现在,两个家伙 A 和 H 都持有对象 B 的引用。在这种情况下,让我们研究 Retained heap 计算将会发生什么变化。

图 3:新增对 B 的引用

在这种情况下,对象 A 的 Retained heap 大小将从之前的 70 减小到 40 个字节。是不是很吃惊?如果对象 A 被垃圾回收了,则将仅会影响 C、F 和 G 对象的引用。因此,仅对象 C、F 和 G 将被垃圾回收。另一方面,由于 H 持有对 B 的活动引用,因此对象 B、D 和 E 将继续存在于内存中。因此,即使 A 被垃圾回收,B、D 和 E 也不会从内存中删除。因此,A 的 Retained heap 大小为:= A 的 shallow heap 大小 + C 的 shallow heap 大小 + F 的 shallow heap 大小 + G 的 shallow heap 大小 = 10 bytes + 10 bytes + 10 bytes + 10 bytes = 40 bytes.

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

希望本文能够让你了解 Eclipse MAT 中的 Shallow heap 大小 和 Retained heap 大小

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

JVM 内存分析神器 MAT: Shallow Heap Vs Retained Heap 你理解的对吗?相关推荐

  1. JVM 内存分析神器 MAT: Incoming Vs Outgoing References 你真的了解吗?

    点击上方蓝色字体,选择"设为星标" 优质文章,及时送达 了解 Eclipse MAT 中 incoming and outgoing 引用之间的区别. Eclipse MAT(内存 ...

  2. JVM 内存分析工具 - MAT

    文章目录 1 简介 2 使用 2.1 准备 MAT 2.2 准备堆转储文件(Heap Dump) 2.3 分析堆转储文件 2.3.1 Histogram 2.3.2 Leak Suspects 2.3 ...

  3. mat 内存分析 Linux,JVM内存分析工具MAT使用简介

    # Memory Analyzer使用简介 markdown格式渲染异常请阅读附件. - [Memory Analyzer使用简介](#memory-analyzer使用简介) - [MAT 简介]( ...

  4. envi 文件 生成mat_JVM 内存分析工具 MAT 的深度讲解与实践——入门篇

    1. MAT 工具简介 MAT(全名:Memory Analyzer Tool),是一款快速便捷且功能强大丰富的 JVM 堆内存离线分析工具.其通过展现 JVM 异常时所记录的运行时堆转储快照(Hea ...

  5. linux java内存分析_Java内存分析利器MAT使用详解

    这是一篇阅读MAT helper的笔记.Heap dump是Java进程在特定时间的一个内存快照.通常在触发heap dump之前会进行一次full gc,这样dump出来的内容就包含的是被gc后的对 ...

  6. 内存分析工具MAT的使用

    原文链接:http://www.jianshu.com/p/d8e247b1e7b2 MAT简介 MAT(Memory Analyzer Tool),一个基于Eclipse的内存分析工具,是一个快速. ...

  7. Java内存分析工具MAT(Memory Analyzer Tool)的介绍与使用

    详细介绍了Java内存分析工具MAT(Memory Analyzer Tool)的常见使用方法,MAT可以帮助Java程序员快速进行内存分析,定位问题. MAT(Memory Analyzer Too ...

  8. Eclipse MAT 里面的SHALLOW HEAP和RETAINED HEAP是什么意思?

    原文在这里: Eclipse MAT 里面的SHALLOW HEAP和RETAINED HEAP是什么意思? MAT是一款非常强大的JVM内存映像分析工具,对分析内存相关的问题非常有用,MAT报告中对 ...

  9. MAT工具学习,incoming reference和outgoing reference,Shallow Heap和Retained Heap

    MAT工具学习 incoming reference和outgoing reference Shallow Heap和Retained Heap 常用工具 一般思路 incoming referenc ...

  10. 内存分析工具 MAT 详解

    Mat的作用 MAT是Memory Analyzer tool的缩写,是一种快速,功能丰富的Java堆分析工具,能帮助你查找内存泄漏和减少内存消耗.很多情况下,我们需要处理测试提供的hprof文件,分 ...

最新文章

  1. 关于打开新链接,用当前页还是用新页面?
  2. android Butter Knife 使用详解
  3. DeepLearning:tensorflow 参数初始化和参数保存
  4. 7-153 找鞍点 (20 分)
  5. 845芯片组SMM 控制寄存器
  6. 剑指Offer——和为s的两个数字
  7. GdiPlus[40]: 不该忽略的一些基础结构
  8. WordPress如何开启用户注册功能
  9. Emoji表情代码大全
  10. jekyll 完整安装教程
  11. android 拍照水印日期,胶片日期水印app安卓版-胶片日期水印手机版预约v1.0-发卡屋...
  12. 【WAX云钱包】Cloudflare反爬虫突破(SSL指纹识别)
  13. python 公众号 关注者位置_微信公众号获取用户地理位置
  14. 5g网速究竟有多快?比4g快多少?
  15. JavaWeb开发 —— Ajax
  16. 网站SEO优化几个月才有效果?
  17. 数字地球与计算机技术联系,关于数字地球应用前景的正确说法是
  18. 利用Nginx反向代理解决80端口复用(内网域名转发)问题
  19. Unity存储路径具体位置整理(Win+Android+ios)
  20. 【分享】5S管理专员测试试题

热门文章

  1. python学习笔记6--双色球需求实现
  2. 中国移动通信互联网短信网关接口协议CMPP2.0(普通文本短信、二进制数据短信)
  3. JAVA根据年月查询当月的天数
  4. 流式布局显示/日历显示
  5. IDEA开发工具整合YAPI接口平台
  6. css怎样清除隐藏溢出,Css溢出隐藏
  7. PHPUnit 在 Windows下的安装
  8. Egret之Eui.Button换肤
  9. 为Onda v820w CH (v1) DualOS平板刷写Remix单系统
  10. ”微服务一条龙“最佳指南-工具篇:初步使用Pipenv