IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

理解Heap Profling名词-Shallow和Retained Sizes

淘宝JAVA中间件团队博客 2011-03-29 00:08:57 累计浏览 3,203 次
本机暂存

    所有包含Heap Profling功能的工具(MAT, Yourkit, JProfiler, TPTP等)都会使用到两个名词,一个是Shallow Size,另一个是 Retained Size.

     这是两个在平时不太常见的名词,本文会对这两个名词做一个详细的解释。

    Shallow Size

     对象自身占用的内存大小,不包括它引用的对象。

     针对非数组类型的对象,它的大小就是对象与它所有的成员变量大小的总和。当然这里面还会包括一些java语言特性的数据存储单元。

     针对数组类型的对象,它的大小是数组元素对象的大小总和。

    Retained Size

     Retained Size=当前对象大小+当前对象可直接或间接引用到的对象的大小总和。(间接引用的含义:A->B->C, C就是间接引用)

     换句话说,Retained Size就是当前对象被GC后,从Heap上总共能释放掉的内存。

     不过,释放的时候还要排除被GC Roots直接或间接引用的对象。他们暂时不会被被当做Garbage。

    看图理解Retained Size

    原图已失效

     上图中,GC Roots直接引用了A和B两个对象。

    A对象的Retained Size=A对象的Shallow Size

     B对象的Retained Size=B对象的Shallow Size + C对象的Shallow Size

    这里不包括D对象,因为D对象被GC Roots直接引用。

     如果GC Roots不引用D对象呢?

    原图已失效

    此时,

     B对象的Retained Size=B对象的Shallow Size + C对象的Shallow Size + D对象的Shallow Size

    转载请注明原文链接:http://kenwublog.com/understand-shallow-and-retained-size-in-hprofling

同分类推荐文章

  1. 等了十年的 Go 链式管道,终于来了:seq 让你像写 Scala 一样写 Go (2026-06-25 18:38:18)
  2. Go 实验特性详解 (2026-06-21 10:05:27)
  3. amd64 微架构级别对 Go 程序性能提升多少? (2026-06-21 09:38:49)

查看更多 后端 文章 →

建议继续学习

  1. SmartSprites - 命令行形式的CSS Sprites生成器 (累计阅读 123,894)
  2. Java开发岗位面试题归类汇总 (累计阅读 22,156)
  3. android 开发入门 (累计阅读 19,527)
  4. 我的PHP,Python和Ruby之路 (累计阅读 13,147)
  5. HashMap解决hash冲突的方法 (累计阅读 12,654)
  6. 一个大二学生有关如何成为一名软件工程师的疑问及答复 (累计阅读 9,181)
  7. Java程序员应该知道的10个eclipse调试技巧 (累计阅读 8,012)
  8. 如何让员工忠于公司? (累计阅读 7,940)
  9. Java技术路线 (累计阅读 7,725)
  10. 聊聊ThoughtWorks面试 (累计阅读 7,614)