【Java】Java对象空间占用如何计算?

Java对象空间占用如何计算?

要想搞清楚实例对象占用多少空间,首先需要知道Java的数据类型。

Java数据类型分为引用数据类型和基本数据类型。

引用数据类型是由引用变量(refvar)和指向的实际对象两部分组成的。

引用变量是基本数据类型,存放的是引用指向实际对象的内存地址,实际对象存放在堆中。

9种基本数据类型

类型大小
boolean1B
byte1B
char2B
short2B
int4B
long8B
float4B
double8B
refvar4B

为什么boolean类型是1B而不是1bit呢?

那是因为计算机最小数据处理单位是字节,所以虽然布尔类型实际只使用1位,但是需要将其他7位补0凑够1字节。

在开始计算前,还需要明白一些概念:

基本概念

在开始计算前,还需要明白一些概念:

对象头

包括两部分:

  1. 对象标记(哈希码、GC标记、GC词数、同步锁标记、偏向锁持有者),占用8B。

  2. 类元信息(类元信息是指向它的类元数据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对象空间占用如何计算?

以上是 【Java】Java对象空间占用如何计算? 的全部内容, 来源链接: utcz.com/a/95822.html

回到顶部