深入理解JVM干货教学 - 【Shallow、Retained 、Deep Object Size 计算】
创始人
2025-05-29 22:03:22
0

🔥深入理解JVM干货教学 - 【Shallow、Retained 、Deep Object Size 计算】

1、常用基本数据类型大小

为了更好的理解JVM 计算大小,我们先看一下我们Java 常用的每种常见类型消耗占用的空间要求 如下:
PS:32 bit-VM 或者 64bit-VM 【存在压缩指针】消耗大小一致

类型消耗bytes
对象引用4 bytes
boolean2 bytes
short、char4 bytes
int、float4 bytes
long、double8 bytes

除此之外:针对以上所有的数据类型 当它作为数组类型时,消耗字节大小一致的。

2、Shallow、Deep、Retained Object 是什么?

1.1、Shallow Size

定义:在计算对象的Shallow 大小,考虑对象本身包含的大小

例如 :Student这个对象
Student Shallow Size =对象本身 Size【header部分+padding】+对象属性引用本身 Size
在这里插入图片描述

1.1.1、举个例子

定义一个简单类:

//材料类
public class Material {private String description;public String getDescription() {return description;}public void setDescription(String description) {this.description = description;}public Material(){}public Material(String description){this.description=description;}
}
//拥有者
public class Owner {private long id;
}
//安全门 包含 拥有者ID、材料描述 、类型
public class SecurityDoor {private String metaType;private  boolean lockFlag;private  Material  material;private List list;public Material getMaterial() {return material;}public void setMaterial(Material material) {this.material = material;}}-------------------------------------public static void main(String[] args) {Material material=new Material("1234567890");SecurityDoor securityDoor =new SecurityDoor();securityDoor.setMaterial(material);System.out.println(ClassLayout.parseInstance(securityDoor).toPrintable());}

SecurityDoor Shallow 大小结果

org.openjdk.jol.samples.domain.SecurityDoor object internals:
OFF  SZ                                      TYPE DESCRIPTION               VALUE0   8                                           (object header: mark)     0x0000000000000001 (non-biasable; age: 0)8   4                                           (object header: class)    0xf800c14312   1                                   boolean SecurityDoor.lockFlag     false13   3                                           (alignment/padding gap)   16   4                          java.lang.String SecurityDoor.metaType     null20   4   org.openjdk.jol.samples.domain.Material SecurityDoor.material     null24   4                            java.util.List SecurityDoor.list         null28   4                                           (object alignment gap)    
Instance size: 32 bytes
Space losses: 3 bytes internal + 4 bytes external = 7 bytes totalProcess finished with exit code 0

分析
按照我们分析如下:

  • String、Material、Owner 3个对象引用,每个占用 4 个字节。3*4=12 bytes
  • 一个 占用 1 bytes 的 boolean
  • 对象Header 占用 12 bytes 【不清楚参考 为什么12 bytes 参考 如下文章 深入理解JVM干货教学 - 【Java对象结构】

一共占用 字节 12 + 1+12=25 ,由于VM 要求字节填充是8的整数倍 ,在填充 8字节刚到达到 32 bytes

1.2、Deep Object Size

定义:对象的深度大小:Shallow Size+所有引用依赖对象的Size
当然 这个对象深度大小是跟 对象的复杂度相关的,如果对象 可达性越来越复杂 他们的深度大小越来越大

1.2.1、举个例子

还是上述 SecurityDoor类,我们在对象中设置一个 Material 对象值

public static void main(String[] args) {Material material=new Material("1234567890");SecurityDoor securityDoor =new SecurityDoor();securityDoor.setMaterial(material);System.out.println(" SecurityDoor Shallow 对象大小布局:");System.out.println(ClassLayout.parseInstance(securityDoor).toPrintable());System.out.println("SecurityDoor 中 material 字符串Description Shallow 对象大小布局:");System.out.println(ClassLayout.parseInstance(material.getDescription()).toPrintable());System.out.println(" material 字符串Description 中char  Shallow 对象大小布局:");System.out.println(ClassLayout.parseInstance(material.getDescription().toCharArray()).toPrintable());}

执行结果

org.openjdk.jol.samples.domain.SecurityDoor object internals:
OFF  SZ                                      TYPE DESCRIPTION               VALUE0   8                                           (object header: mark)     0x0000000000000001 (non-biasable; age: 0)8   4                                           (object header: class)    0xf800c18412   1                                   boolean SecurityDoor.lockFlag     false13   3                                           (alignment/padding gap)   16   4                          java.lang.String SecurityDoor.metaType     null20   4   org.openjdk.jol.samples.domain.Material SecurityDoor.material     (object)24   4                            java.util.List SecurityDoor.list         null28   4                                           (object alignment gap)    
Instance size: 32 bytes
Space losses: 3 bytes internal + 4 bytes external = 7 bytes totalSecurityDoor 中 material 字符串Description Shallow 对象大小布局:
java.lang.String object internals:
OFF  SZ     TYPE DESCRIPTION               VALUE0   8          (object header: mark)     0x0000000000000001 (non-biasable; age: 0)8   4          (object header: class)    0xf80002da12   4   char[] String.value              [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]16   4      int String.hash               020   4          (object alignment gap)    
Instance size: 24 bytes
Space losses: 0 bytes internal + 4 bytes external = 4 bytes totalmaterial 字符串Description 中char  Shallow 对象大小布局:
[C object internals:
OFF  SZ   TYPE DESCRIPTION               VALUE0   8        (object header: mark)     0x0000000000000001 (non-biasable; age: 0)8   4        (object header: class)    0xf800004112   4        (array length)            1016  20   char [C.             N/A36   4        (object alignment gap)    
Instance size: 40 bytes
Space losses: 0 bytes internal + 4 bytes external = 4 bytes total

结果分析

SecurityDoor Deep Object 大小:

  • SecurityDoor 本身 Shallow size :32 bytes
  • Material 对象中有一个 每个 String 对象,【String都封装了一个 char[] 】 24 bytes
  • 查看String对象中 char[] 数组的大小 40 bytes 【PS:JDK9 封装的 bytes[] 因此这个大小可能会受到影响

当前对象 Deep Object Size 对象大小:32+24+40= 96 bytes

1.3、Retained Object Size

定义:当 GC 回收对象占用的内存时,它会释放特定数量的内存。该数量是该对象的Retained大小。

在这里插入图片描述
GC Student 实例 A 和 age 无法访问,但 Card 仍然可以通过 Student-B对象访问到。
Card 被 Student-B 对象引用因此不参与释放大小。
因此保留大小计算 一般 会在 Shallow 、Deep Object Size 之间

相关内容

热门资讯

西葫芦虾滑饼:鲜嫩虾滑与清爽西... 准备材料:西葫芦虾滑盐白胡椒粉 具体步骤:西葫芦刨丝:将西葫芦刨成细丝。加盐杀出水分:在西葫芦丝上...
原创 饭... 标题:饭店里最坑爹的三道菜,图一我忍了,图三你要是能吃下去我服你。 在美食的世界里,我们总是对那些...
酱汁浓郁好吃到起飞的家庭版香菇... "这真的是自己做的炸酱?"老公盯着碗里乌黑发亮的炸酱,筷子悬在半空迟迟不敢落下。在北京胡同住了40年...
泊头鸭梨多种吃法 泊头鸭梨凭借其皮薄肉细、汁多脆甜的特点,可衍生出多种特色吃法,结合传统养生智慧与现代创意,形成独特的...
原创 误... 哪怕只有一个人吃饭,也要做到精致得体,美食、不仅仅是为了果腹,更是对生活的一种品味和追求,用心去过好...
原创 夏... 导语:夏天,鸡蛋和它才是绝配,通便排毒,利湿解暑热,软嫩爽口,遇到别再错过了! 大家好,我是傻姐美食...
SpringBoot整合Jav... 目录 一、创建一个spring boot工程 二、导入JavaFX依赖 三、创建fxml文件以及co...
阅读ReentrantLock... AbstractQueuedSynchronizer,缩写AQS,翻译过...
yolov5 网络结构(暂记) Backbone :Focus + BottleneckCSP+SPP Focus ...
【教程】nginx快速学习 【教程】nginx快速学习备注一、基础概念1.nginx概念2.反向代理和负载均衡二、安装和部署1....
C++中类的静态、常量、引用成... 1、类的静态成员变量,必须在类外再声明一次 这是因为类内的声明只是描述了类的成员变量和...
中国人工智能企业CIMCAI世... 中国上海人工智能企业CIMCAI全球港航人工智能领军者,成熟智慧港航产品数字化航运自动...
适合学生党的蓝牙耳机品牌有哪些... 蓝牙耳机越来越成为我们日常生活中不可或缺的存在,不管是听歌、追剧、玩游戏还是外出运动等...
ES-模糊查询 1. 前缀搜索:prefix 概念:以xx开头的搜索,不计...
【数据结构刷题】链表OJ题训练... 文章目录前言1. 移除链表元素2. 反转链表3. 链表的中间结点4. 合并两个有序链表5. 链表分割...
原创 果... 在这个充满变幻与磨难的时代,人们往往在追求卓越的同时,忽略了生活中细腻的情感。如今,一位名叫袁心玥的...
DETR源码讲解(四)之注意力... 本篇应该在模型训练模块讲解的,但在DETR中的多头注意力机制使用的是pytorch官方...
如何在线免费调整 PNG/JP... PNG 是常用的图像格式之一,有时需要调整图像大小。要将图片上传到您的博客、网站、电子...
H 扫雷 / 手写哈希+bfs 扫雷 小明最近迷上了一款名为《扫雷》的游戏。 其中有一个关卡的任务如下: 在一个二维平...
打卡老君山,人间仙境入画来 老... 陶永奎 摄打卡老君山,人间仙境入画来打卡老君山,人间仙境入画来打卡老君山,人间仙境入画来打卡老君山,...