关闭

Java堆:Shallow Size和Retained Size

标签: Javashallow sizeretained size
174人阅读 评论(0) 收藏 举报
分类:

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成员(3*4=12字节)、一个char[]成员(1*4=4字节)以及一个对象头(8字节),总共3*4 +1*4+8=24字节。根据这一原则,对String a=”rosen jiang”来说,实例a的shallow size也是24字节。(注意:上述String是jdk1.5的,代码如下:)

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. public final class String  
  2.     implements java.io.Serializable, Comparable<String>, CharSequence  
  3. {  
  4.     /** The value is used for character storage. */  
  5.     private final char value[];  
  6.   
  7.     /** The offset is the first index of the storage that is used. */  
  8.     private final int offset;  
  9.   
  10.     /** The count is the number of characters in the String. */  
  11.     private final int count;  
  12.   
  13.     /** Cache the hash code for the string */  
  14.     private int hash; // Default to 0  
jdk1.7的String实现已经变了。)

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

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

从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是一个整体度量,有助于理解内存结构和对象图中的依赖关系并找到根节点。


转自:http://blog.csdn.net/kingzone_2008/article/details/9083327

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

Android性能专项测试之Heap Snapshot工具

Speed up your app Heap Snapshot能做什么?获取Java堆内存详细信息,可以分析出内存泄漏的问题Heap Dump启动在内存面包中,点击图中红色标注的按钮,就会显示我们的H...
  • qhshiniba
  • qhshiniba
  • 2015-10-09 17:25
  • 6938

性能优化三之内存泄漏分析工具使用以及如何分析

这篇文章主要 分为四部分来具体讲解: 1.HeapSnapShot使用 2.HeapViewer使用 3.MAT使用 4.实际开发中怎么去运用上面三个工具来寻找可能发生内存泄漏的代码。 第一部分:...
  • hpc19950723
  • hpc19950723
  • 2016-12-10 22:33
  • 1443

STM32分配堆栈空间不足问题原因及解决方法

本文针对实践中STM32堆栈空间不足问题展开讨论。经过分析发现,如果动态内存分配需求过多时,需要手动调节堆空间。可以通过修改启动文件或在STM32CubeMX中也可对堆栈大小进行修改。并初步得出用户可...
  • lighthear
  • lighthear
  • 2017-04-06 21:20
  • 4244

Java堆:Shallow Size和Retained Size

Shallow size就是对象本身占用内存的大小,不包含其引用的对象。常规对象(非数组)的Shallow size有其成员变量的数量和类型决定。数组的shallow size有数组元素的类型(对象类...
  • kingzone_2008
  • kingzone_2008
  • 2013-06-13 11:08
  • 17896

MAT基础知识:Shallow和Retained Size

MAT基础知识:Shallow和Retained Size对于所有独立的对象,包括对象的结合都有他们自己的shallow size和retained size。Shallow Size一个对象的Sha...
  • FIRE_TRAY
  • FIRE_TRAY
  • 2015-11-11 17:24
  • 813

使用MAT时的Shallow Size和 Retained Size的区别

所有包含Heap Profling功能的工具(MAT, Yourkit, JProfiler, TPTP等)都会使用到两个名词,一个是Shallow Size,另一个是 Retained Size. ...
  • e5945
  • e5945
  • 2012-07-02 13:18
  • 2997

Shallow Size、Retained Size、Heap Size和Allocated

Shallow Size: 对象本身占用的内存空间,不包含其引用的对象,但在JAVA中除基本类型外,一切均为对象,也就是说持有的一直为对象的引用,如String类型对象,它主要包含3个int成员(3*...
  • yincheng886337
  • yincheng886337
  • 2016-01-14 14:39
  • 1918

SORT_AREA_SIZE和SORT_AREA_RETAINED_SIZE的区别以及设置

一、SORT_AREA_SIZE和SORT_AREA_RETAINED_SIZE的区别 SQL> select emp.deptno, ename   2  from emp,...
  • xujinyang
  • xujinyang
  • 2011-11-29 16:50
  • 2056

java.security.InvalidKeyException: Illegal key size 解决方案

  • 2015-09-11 13:23
  • 24KB
  • 下载

Heap Profling名词-Shallow和Retained Sizes的简介

Shallow Size 对象自身占用的内存大小,不包括它引用的对象。 针对非数组类型的对象,它的大小就是对象与它所有的成员变量大小的总和。当然这里面还会包括一些java语言特性的数据存储单元。 ...
  • bbyyzhang
  • bbyyzhang
  • 2011-09-02 10:01
  • 841
    个人资料
    • 访问:19563次
    • 积分:445
    • 等级:
    • 排名:千里之外
    • 原创:23篇
    • 转载:7篇
    • 译文:1篇
    • 评论:2条
    最新评论