JVM对象深堆和浅堆

本文详细讲解了浅堆的概念,如对象大小计算及内存对齐规则,并通过实例说明如何计算深堆,涉及保留集和支配树的概念。此外,还涵盖了对象实例的内存布局示例,展示了如何通过实例计算WebPages对象的深堆大小。
摘要由CSDN通过智能技术生成

基本概念

1)浅堆: 一个对象在内存中占用的大小

class Person{
	int age;
	String name;
	boolean sex;
	public Person(name){
	this.name = name;
}
Person对象在内存中的浅堆为
 12(压缩后的字节头) + 4(int) + 4(String引用类型) + 1(boolean) = 21Byte
 之后需要8字节对齐,故最终浅堆大小为 24Byte

2)保留集:由此对象引用的对象集合(包括对象自己)
3)深堆: 该对象保留集所有对象的浅堆大小之和,即回收该对象能释放的内存空间

Person p = new Person("lzw");
p是局部变量,指向堆中Person对象
深堆大小 = 自己浅堆大小 + String浅堆大小 + char[]数据的浅堆大小
该Person对象的浅堆大小为24Byte(上述计算过)
String浅堆大小 = 4(int, 对象引用) * 3 + 12(对象头) = 24Byte
String{
int hash32;
int hash;
char[] value;
}
char[]数据的浅堆大小 = 12(对象头) + 4(记录数组长度) + 3 * 2("lzw"3char) = 22--->24
----故 该对象深堆大小 = 24 + 24 + 24 = 72Byte

举例

1)浅堆
Object o = new Object[15];
数组浅堆大小 = 12(头) + 4(数组长度) + 15 * 4(引用类型) = 76 ---- 80
2)深堆

class WebPages{
	String url;
	String content;
	WebPages(url,content){
	this.url = url;
	this.content = content;
}
WebPages w = new WebPages("http://www.14.com","14");

WebPages浅堆大小 = 12 + 4(引用类型) * 2 = 20 ----->24
url浅堆大小 = 12 + 4 * 3 = 24
content浅堆大小 = 24
char[17] 浅堆大小 = 12 + 4 + 17 * 2 = 50---->56
char[2]浅堆大小 = 12 + 4 + 2 * 2 = 20----->24
故对象WebPages深堆大小为 24 * 4 + 56 = 152Byte

支配树

所有到B的引用关系,都必须经过对象A,才能引用到B,就称A支配B。

A的子树(所有被A支配的对象集合) ,就是深堆
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值