84669 Lernen von Personen
152542 Lernen von Personen
20005 Lernen von Personen
5487 Lernen von Personen
7821 Lernen von Personen
359900 Lernen von Personen
3350 Lernen von Personen
180660 Lernen von Personen
48569 Lernen von Personen
18603 Lernen von Personen
40936 Lernen von Personen
1549 Lernen von Personen
1183 Lernen von Personen
32909 Lernen von Personen
java中shallow size 单位是什么
小伙看你根骨奇佳,潜力无限,来学PHP伐。
想要说清楚shallow size就必须要提到Retained Size。shallow size: 表示自身对象占用的大小。retained size: 自身对象+引用对象的retained大小。
先借用一张图,这张图更能清楚的表示他们之间的计算关系。
B的shallow size = B;
B的retained size = B shallow size + C retained size + D retained size;
在举例之前,首先要了解JAVA对象在堆中的存储,我们以32位JVM虚拟机为例:JAVA对象在堆中共有3个部分组成:
对象头 对象头又包含两部分数据; 一:运行时数据。 32位JVM为32位即4byte.64位为8byte. 二:类型指针。
实例数据 即存放实例变量的数据,变量类型包括两种 基本类型变量和引用变量。 基本类型变量所占据的字节大小就不说了,引用变量我们存放的是指针。
填充数据 对象存储空间为8byte的整数倍,如果对象头+实例数据不足8byte的整数倍,则进行填充。
说到引用类型大小,32位虚拟机下引用占据4byte. 64位虚拟机下如果不开启指针压缩,则引用占据8byte。
下面我们根据例子进行说明:
public class TestObjSize { private int a = 1; private boolean b = true; private TestObjSize testObjSize; public static void main(String[] args) { Object object = new Object(); TestObjSize test = new TestObjSize();//这个new出来的对象记为obj1 test.testObjSize = new TestObjSize();//这个new出来的对象记为obj2 System.out.println(object.hashCode()); System.out.println(test.hashCode()); try { Thread.sleep(3000000); } catch (InterruptedException e) { e.printStackTrace(); } } }
因为shallow size与实例变量是否有引用无关,所我们先分析下**TestObjSize的shallow size,shallow size = 4byte(对象头) + 4byte(类型指针) + 4byte(int a) + 1byte(boolean b) + 4byte(TestObjSize引用) = 17;** 17不是8的整数倍所以会有7个byte的填充数据,最终TestObjSize类型的实例对象的shallow size = 24;
根据例子我们看到obj2对象的testObjSize = null,obj2的retained size = obj2的shallow size = 24;obj1对象的testObjSize为obj2,所以obj1的retained size = obj1的shallow size + obj2的retained size = 48;
最后附上heapdump!
如有错误,请看客指证。
想要说清楚shallow size就必须要提到Retained Size。
shallow size: 表示自身对象占用的大小。
retained size: 自身对象+引用对象的retained大小。
先借用一张图,这张图更能清楚的表示他们之间的计算关系。
B的shallow size = B;
B的retained size = B shallow size + C retained size + D retained size;
在举例之前,首先要了解JAVA对象在堆中的存储,我们以32位JVM虚拟机为例:
JAVA对象在堆中共有3个部分组成:
对象头
对象头又包含两部分数据;
一:运行时数据。 32位JVM为32位即4byte.64位为8byte.
二:类型指针。
实例数据
即存放实例变量的数据,变量类型包括两种 基本类型变量和引用变量。
基本类型变量所占据的字节大小就不说了,引用变量我们存放的是指针。
填充数据
对象存储空间为8byte的整数倍,如果对象头+实例数据不足8byte的整数倍,则进行填充。
说到引用类型大小,32位虚拟机下引用占据4byte. 64位虚拟机下如果不开启指针压缩,则引用占据8byte。
下面我们根据例子进行说明:
因为shallow size与实例变量是否有引用无关,所我们先分析下**TestObjSize的shallow size,
shallow size = 4byte(对象头) + 4byte(类型指针) + 4byte(int a) + 1byte(boolean b) + 4byte(TestObjSize引用) = 17;**
17不是8的整数倍所以会有7个byte的填充数据,最终TestObjSize类型的实例对象的shallow size = 24;
根据例子我们看到obj2对象的testObjSize = null,
obj2的retained size = obj2的shallow size = 24;
obj1对象的testObjSize为obj2,所以obj1的retained size = obj1的shallow size + obj2的retained size = 48;
最后附上heapdump!
如有错误,请看客指证。