Shallow size就是对象本身占用内存的大小,不包含其引用的对象。常规对象(非数组)的Shallow size有其成员变量的数量和类型决定。数组的shallow size有数组元素的类型(对象类型、基本类型)和数组长度决定。Shallow size of a set of objects represents the sum of shallow sizes of all objects in the set.在32位系统上,对象头占用8字节,int占用4字节,不管成员变量(对象或数组)是否引用了其他对象(实例)或者赋值为null它始终占用4字节。故此,对于String对象实例来说,它有三个int成员(34=12字节)、一个char[]成员(14=4字节)以及一个对象头(8字节),总共34 +14+8=24字节。根据这一原则,对String a=”rosen jiang”来说,实例a的shallow size也是24字节。(注意:上述String是jdk1.5的,代码如下:)

public final class Stringimplements java.io.Serializable, Comparable<String>, CharSequence
{/** The value is used for character storage. */private final char value[];/** The offset is the first index of the storage that is used. */private final int offset;/** The count is the number of characters in the String. */private final int count;/** Cache the hash code for the string */private int hash; // Default to 0

jdk1.7的String实现已经变了。)
Retained size是该对象自己的shallow size,加上从该对象能直接或间接访问到对象的shallow size之和。换句话说,retained size是该对象被GC之后所能回收到内存的总和。为了更好的理解retained size,不妨看个例子。

把内存中的对象看成下图中的节点,并且对象和对象之间互相引用。这里有一个特殊的节点GC Roots,这就是reference chain的起点。
Figure 1:

Figure 2:

从obj1入手,上图中蓝色节点代表仅仅只有通过obj1才能直接或间接访问的对象。因为可以通过GC Roots访问,所以左图的obj3不是蓝色节点;而在右图却是蓝色,因为它已经被包含在retained集合内。

所以对于左图,obj1的retained size是obj1、obj2、obj4的shallow size总和;右图的retained size是obj1、obj2、obj3、obj4的shallow size总和。
对于obj2,它的retained size是:在左图中,是obj2和obj4的shallow size的和;在右图中,是obj2、obj3和obj4的shallow size的和。

总之,retained size是一个整体度量,有助于理解内存结构和对象图中的依赖关系并找到根节点。

英文原文:Shallow and retained sizes

参考:
http://www.blogjava.net/rosen/archive/2010/05/21/321575.html
https://blog.csdn.net/kingzone_2008/article/details/9083327

Java堆:Shallow Size和Retained Size相关推荐

  1. Shallow size和Retained size

    Shallow size就是对象本身占用内存的大小,不包含其引用的对象.常规对象(非数组)的Shallow size有其成员变量的数量和类型决定.数组的shallow size有数组元素的类型(对象类 ...

  2. GC之二--GC是如何回收时的判断依据、shallow(浅) size、retained(保留) size、Deep(深)size...

    回到问题"为何会内存溢出?". 要回答这个问题又要引出另外一个话题,既什么样的对象GC才会回收? 一.对象存活方式判断方法 在上一篇文章<GC之一--GC 的算法分析.垃圾收 ...

  3. Java 中array.size()_Java ArrayDeque size()方法与示例

    ArrayDeque类size()方法size()方法在java.lang包中可用. size()方法用于返回存储在此双端队列中的大小(元素数). size()方法是一个非静态方法,只能通过类对象访问 ...

  4. 创建和分析 Java 堆转储(Heap Dumps)

    作为 Java 开发人员,我们熟悉我们的应用程序抛出 OutOfMemoryErrors 或我们的服务器监控工具抛出警报并抱怨 JVM 内存利用率高. 要调查内存问题,通常首先要查看 JVM 堆内存. ...

  5. 哪个更快:Java 堆还是本地内存

    使用Java的一个好处就是你可以不用亲自来管理内存的分配和释放.当你用new关键字来实例化一个对象时,它所需的内存会自动的在Java堆中分配.堆会被垃圾回收器进行管理,并且它会在对象超出作用域时进行内 ...

  6. java堆 数据结构 堆_Java中的紧凑堆外结构/组合

    java堆 数据结构 堆 在上一篇文章中,我详细介绍了代码对主内存的访问方式的含义. 从那时起,我就在Java中可以做什么以实现更可预测的内存布局提出了很多疑问. 有些模式可以使用数组支持的结构来应用 ...

  7. java 本地内存_哪个更快:Java堆还是本地内存

    使用Java的一个好处就是你可以不用亲自来管理内存的分配和释放.当你用new关键字来实例化一个对象时,它所需的内存会自动的在Java堆中分配.堆会被垃圾回收器进行管理,并且它会在对象超出作用域时进行内 ...

  8. OOM系列之一:java.lang.OutOfMemoryError: Java堆空间问题详解

    第一篇:java.lang.OutOfMemoryError: Java heap space Java 应用程序只允许使用有限的内存量.此限制是在应用程序启动期间指定的.为了让事情变得更复杂,Jav ...

  9. java 堆内存结构_JAVA之内存结构

    概述 JAVA是我们现在最常用的开发语言,而他的垃圾回收机制(Garbage Collection)的重要作用不言而喻,以下简称GC,所以了解GC至关重要,现本人对于GC机制以前的理解和现在的理解记录 ...

  10. HotSpot虚拟机在java堆中的内存使用

    1  简介 依托JavaTM 2平台的力量,标准版(J2SETM)实现了内存的自动管理,将开发人员从复杂的显式内存管理中解放出来. 本文将对Sun公司的J2SE发行版中的Java HotSpot虚拟机 ...

最新文章

  1. C++ namespace 的作用以及使用
  2. 如何在Linux使用Eclipse + CDT开发C/C++程序 OS Linux C/C++ gcc
  3. dxf转pdf linux,4个最好的PDF转DXF格式的在线转换器
  4. 【论文知识点笔记】GNN流程到GCN流程
  5. opencv计算物体姿态旋转_OpenCV轮廓检测,计算物体旋转角度
  6. SAP云平台里的日志系统概述
  7. MyBatis中的原理
  8. 第四十五期:程序员未来干什么?做架构还是做管理?
  9. 再见,付费录屏软件!我用70行Python代码打造免费版!
  10. 你试过一个人旅游吗?去了哪里?
  11. 串口.Qt532测试(异步)
  12. 用C/C++写CGI程序
  13. [转载] windows安装mysql及使用navicat连接
  14. [译] Dweb: Beaker--去中心化的浏览器 (中英)
  15. 推荐一本Vue开发的书籍
  16. 表单验证之 formik 简单用法
  17. 唯品会API:item_search - 按关键字搜索vip商品
  18. C语言程序设计——用户密码输入与判断
  19. 饥荒服务器显示队友mod,饥荒怎么显示物品给队友看 | 手游网游页游攻略大全
  20. mysql密码为空包密码错误_apk空包签名方法及工具

热门文章

  1. Failed to read artifact descriptor for
  2. 我的新书《asp.net开发技巧精讲》
  3. Java如何调用芝麻信用分?
  4. 数组方法的增删等19种操作:unshift 、shift,push、pop、splice等等...!
  5. 八六、Linux 服务器+Nginx服务简介
  6. ROM刷机包下载站领导者:刷机之家
  7. 三级等保 mysql8.0.24密码策略设置
  8. 单片机音频节奏灯_基于单片机的音乐节奏彩灯控制系统设计
  9. 第119章 SQL函数 RIGHT
  10. 程序员转行有哪些方向?人到中年,不能当一辈子普通程序员吧!