JVM对象深堆和浅堆

基本概念

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 * 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支配的对象集合) ,就是深堆
在这里插入图片描述

おすすめ

転載: blog.csdn.net/weixin_43849906/article/details/120786741