Java对象空间占用如何计算?
2021-01-09 本文已影响0人
qiyubing
要想搞清楚实例对象占用多少空间,首先需要知道Java的数据类型。
Java数据类型分为引用数据类型和基本数据类型。
引用数据类型是由引用变量(refvar)和指向的实际对象两部分组成的。
引用变量是基本数据类型,存放的是引用指向实际对象的内存地址,实际对象存放在堆中。
这也解释了为什么说Java方法的参数传递只有值传递了,因为传递的只是把指向对象的内存地址赋值给了方法参数中的局部引用变量,与C++的引用传递并不相同。
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开发手册》
感谢您阅读本文,关注我的公众号“语冰Yubing”可接收最新推送,同时也会激励我坚持创作。