【Java】Java对象空间占用如何计算?
Java对象空间占用如何计算?
要想搞清楚实例对象占用多少空间,首先需要知道Java的数据类型。
Java数据类型分为引用数据类型和基本数据类型。
引用数据类型是由引用变量(refvar)和指向的实际对象两部分组成的。
引用变量是基本数据类型,存放的是引用指向实际对象的内存地址,实际对象存放在堆中。
9种基本数据类型
类型 | 大小 |
---|---|
boolean | 1B |
byte | 1B |
char | 2B |
short | 2B |
int | 4B |
long | 8B |
float | 4B |
double | 8B |
refvar | 4B |
为什么boolean类型是1B而不是1bit呢?
那是因为计算机最小数据处理单位是字节,所以虽然布尔类型实际只使用1位,但是需要将其他7位补0凑够1字节。
在开始计算前,还需要明白一些概念:
基本概念
在开始计算前,还需要明白一些概念:
对象头
包括两部分:
对象标记(哈希码、GC标记、GC词数、同步锁标记、偏向锁持有者),占用8B。
类元信息(类元信息是指向它的类元数据Klass的引用),引用就是占用4B。
对齐填充
由于对象的存储空间分配单位是8个字节,换句话说分配的空间必须是8B的倍数,若只占用12B,也会分配16B。
计算空间占用
class Demo {// +12B 对象头占用
// +1B
byte b;
// +4B 引用
Object obj1;
// +4B 就算引用指向了对象,但是还是只占用引用本身的空间。
Object obj2 = new Object();
// +4B 此处数组也是引用类型,实际数组对象在堆中
double[] d = new double[1000];
}
这样算下来,是25B,根据对齐填充原则,需要分配32B。
感谢您阅读本文,关注我的公众号可接收最新推送,同时您的关注也会激励我坚持创作,谢谢!
以上是 【Java】Java对象空间占用如何计算? 的全部内容, 来源链接: utcz.com/a/95822.html