JVM 内存分析神器 MAT: Shallow Heap Vs Retained Heap 你理解的对吗?
有没有想过 Shallow 和 Retained heap 之间的区别?
Eclipse MAT(内存分析器工具)是分析 JVM 堆 Dump 文件的强大工具。当尝试分析内存相关的问题时,它非常方便。在 Eclipse MAT 内存分析的报告中会显示对象两种类型的 Heap 信息:
- Shallow Heap
- 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 你理解的对吗?相关推荐
- JVM 内存分析神器 MAT: Incoming Vs Outgoing References 你真的了解吗?
点击上方蓝色字体,选择"设为星标" 优质文章,及时送达 了解 Eclipse MAT 中 incoming and outgoing 引用之间的区别. Eclipse MAT(内存 ...
- JVM 内存分析工具 - MAT
文章目录 1 简介 2 使用 2.1 准备 MAT 2.2 准备堆转储文件(Heap Dump) 2.3 分析堆转储文件 2.3.1 Histogram 2.3.2 Leak Suspects 2.3 ...
- mat 内存分析 Linux,JVM内存分析工具MAT使用简介
# Memory Analyzer使用简介 markdown格式渲染异常请阅读附件. - [Memory Analyzer使用简介](#memory-analyzer使用简介) - [MAT 简介]( ...
- envi 文件 生成mat_JVM 内存分析工具 MAT 的深度讲解与实践——入门篇
1. MAT 工具简介 MAT(全名:Memory Analyzer Tool),是一款快速便捷且功能强大丰富的 JVM 堆内存离线分析工具.其通过展现 JVM 异常时所记录的运行时堆转储快照(Hea ...
- linux java内存分析_Java内存分析利器MAT使用详解
这是一篇阅读MAT helper的笔记.Heap dump是Java进程在特定时间的一个内存快照.通常在触发heap dump之前会进行一次full gc,这样dump出来的内容就包含的是被gc后的对 ...
- 内存分析工具MAT的使用
原文链接:http://www.jianshu.com/p/d8e247b1e7b2 MAT简介 MAT(Memory Analyzer Tool),一个基于Eclipse的内存分析工具,是一个快速. ...
- Java内存分析工具MAT(Memory Analyzer Tool)的介绍与使用
详细介绍了Java内存分析工具MAT(Memory Analyzer Tool)的常见使用方法,MAT可以帮助Java程序员快速进行内存分析,定位问题. MAT(Memory Analyzer Too ...
- Eclipse MAT 里面的SHALLOW HEAP和RETAINED HEAP是什么意思?
原文在这里: Eclipse MAT 里面的SHALLOW HEAP和RETAINED HEAP是什么意思? MAT是一款非常强大的JVM内存映像分析工具,对分析内存相关的问题非常有用,MAT报告中对 ...
- MAT工具学习,incoming reference和outgoing reference,Shallow Heap和Retained Heap
MAT工具学习 incoming reference和outgoing reference Shallow Heap和Retained Heap 常用工具 一般思路 incoming referenc ...
- 内存分析工具 MAT 详解
Mat的作用 MAT是Memory Analyzer tool的缩写,是一种快速,功能丰富的Java堆分析工具,能帮助你查找内存泄漏和减少内存消耗.很多情况下,我们需要处理测试提供的hprof文件,分 ...
最新文章
- 关于打开新链接,用当前页还是用新页面?
- android Butter Knife 使用详解
- DeepLearning:tensorflow 参数初始化和参数保存
- 7-153 找鞍点 (20 分)
- 845芯片组SMM 控制寄存器
- 剑指Offer——和为s的两个数字
- GdiPlus[40]: 不该忽略的一些基础结构
- WordPress如何开启用户注册功能
- Emoji表情代码大全
- jekyll 完整安装教程
- android 拍照水印日期,胶片日期水印app安卓版-胶片日期水印手机版预约v1.0-发卡屋...
- 【WAX云钱包】Cloudflare反爬虫突破(SSL指纹识别)
- python 公众号 关注者位置_微信公众号获取用户地理位置
- 5g网速究竟有多快?比4g快多少?
- JavaWeb开发 —— Ajax
- 网站SEO优化几个月才有效果?
- 数字地球与计算机技术联系,关于数字地球应用前景的正确说法是
- 利用Nginx反向代理解决80端口复用(内网域名转发)问题
- Unity存储路径具体位置整理(Win+Android+ios)
- 【分享】5S管理专员测试试题
热门文章
- python学习笔记6--双色球需求实现
- 中国移动通信互联网短信网关接口协议CMPP2.0(普通文本短信、二进制数据短信)
- JAVA根据年月查询当月的天数
- 流式布局显示/日历显示
- IDEA开发工具整合YAPI接口平台
- css怎样清除隐藏溢出,Css溢出隐藏
- PHPUnit 在 Windows下的安装
- Egret之Eui.Button换肤
- 为Onda v820w CH (v1) DualOS平板刷写Remix单系统
- ”微服务一条龙“最佳指南-工具篇:初步使用Pipenv