Java堆:Shallow Size和Retained Size
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相关推荐
- Shallow size和Retained size
Shallow size就是对象本身占用内存的大小,不包含其引用的对象.常规对象(非数组)的Shallow size有其成员变量的数量和类型决定.数组的shallow size有数组元素的类型(对象类 ...
- GC之二--GC是如何回收时的判断依据、shallow(浅) size、retained(保留) size、Deep(深)size...
回到问题"为何会内存溢出?". 要回答这个问题又要引出另外一个话题,既什么样的对象GC才会回收? 一.对象存活方式判断方法 在上一篇文章<GC之一--GC 的算法分析.垃圾收 ...
- Java 中array.size()_Java ArrayDeque size()方法与示例
ArrayDeque类size()方法size()方法在java.lang包中可用. size()方法用于返回存储在此双端队列中的大小(元素数). size()方法是一个非静态方法,只能通过类对象访问 ...
- 创建和分析 Java 堆转储(Heap Dumps)
作为 Java 开发人员,我们熟悉我们的应用程序抛出 OutOfMemoryErrors 或我们的服务器监控工具抛出警报并抱怨 JVM 内存利用率高. 要调查内存问题,通常首先要查看 JVM 堆内存. ...
- 哪个更快:Java 堆还是本地内存
使用Java的一个好处就是你可以不用亲自来管理内存的分配和释放.当你用new关键字来实例化一个对象时,它所需的内存会自动的在Java堆中分配.堆会被垃圾回收器进行管理,并且它会在对象超出作用域时进行内 ...
- java堆 数据结构 堆_Java中的紧凑堆外结构/组合
java堆 数据结构 堆 在上一篇文章中,我详细介绍了代码对主内存的访问方式的含义. 从那时起,我就在Java中可以做什么以实现更可预测的内存布局提出了很多疑问. 有些模式可以使用数组支持的结构来应用 ...
- java 本地内存_哪个更快:Java堆还是本地内存
使用Java的一个好处就是你可以不用亲自来管理内存的分配和释放.当你用new关键字来实例化一个对象时,它所需的内存会自动的在Java堆中分配.堆会被垃圾回收器进行管理,并且它会在对象超出作用域时进行内 ...
- OOM系列之一:java.lang.OutOfMemoryError: Java堆空间问题详解
第一篇:java.lang.OutOfMemoryError: Java heap space Java 应用程序只允许使用有限的内存量.此限制是在应用程序启动期间指定的.为了让事情变得更复杂,Jav ...
- java 堆内存结构_JAVA之内存结构
概述 JAVA是我们现在最常用的开发语言,而他的垃圾回收机制(Garbage Collection)的重要作用不言而喻,以下简称GC,所以了解GC至关重要,现本人对于GC机制以前的理解和现在的理解记录 ...
- HotSpot虚拟机在java堆中的内存使用
1 简介 依托JavaTM 2平台的力量,标准版(J2SETM)实现了内存的自动管理,将开发人员从复杂的显式内存管理中解放出来. 本文将对Sun公司的J2SE发行版中的Java HotSpot虚拟机 ...
最新文章
- C++ namespace 的作用以及使用
- 如何在Linux使用Eclipse + CDT开发C/C++程序 OS Linux C/C++ gcc
- dxf转pdf linux,4个最好的PDF转DXF格式的在线转换器
- 【论文知识点笔记】GNN流程到GCN流程
- opencv计算物体姿态旋转_OpenCV轮廓检测,计算物体旋转角度
- SAP云平台里的日志系统概述
- MyBatis中的原理
- 第四十五期:程序员未来干什么?做架构还是做管理?
- 再见,付费录屏软件!我用70行Python代码打造免费版!
- 你试过一个人旅游吗?去了哪里?
- 串口.Qt532测试(异步)
- 用C/C++写CGI程序
- [转载] windows安装mysql及使用navicat连接
- [译] Dweb: Beaker--去中心化的浏览器 (中英)
- 推荐一本Vue开发的书籍
- 表单验证之 formik 简单用法
- 唯品会API:item_search - 按关键字搜索vip商品
- C语言程序设计——用户密码输入与判断
- 饥荒服务器显示队友mod,饥荒怎么显示物品给队友看 | 手游网游页游攻略大全
- mysql密码为空包密码错误_apk空包签名方法及工具
热门文章
- Failed to read artifact descriptor for
- 我的新书《asp.net开发技巧精讲》
- Java如何调用芝麻信用分?
- 数组方法的增删等19种操作:unshift 、shift,push、pop、splice等等...!
- 八六、Linux 服务器+Nginx服务简介
- ROM刷机包下载站领导者:刷机之家
- 三级等保 mysql8.0.24密码策略设置
- 单片机音频节奏灯_基于单片机的音乐节奏彩灯控制系统设计
- 第119章 SQL函数 RIGHT
- 程序员转行有哪些方向?人到中年,不能当一辈子普通程序员吧!