内容简介
本文深入分析并验证了不同Java对象占用内存空间大小的情况。对于不同的jvm实现,Java对象占用的内存空间大小可能不尽相同,本文主要分析HotSpot jvm中的情况,实验环境为64位window10系统、JDK1.8。
对象头
在64位机器上,默认不开启指针压缩(-XX:-UseCompressedOops)的情况下,对象头占用16bytes,开启指针压缩(-XX:+UseCompressedOops)则占用12bytes。
实例数据
原生类型(primitive type)的内存占用如下:
对象引用(reference)类型在64位机器上,关闭指针压缩时占用8bytes, 开启时占用4bytes。
对齐填充
Java对象占用空间是8字节对齐的,即所有Java对象占用bytes数必须是8的倍数。包含两个属性的对象:int和byte,并不是占用17bytes(12+4+1),而是占用24bytes(对17bytes进行8字节对齐)
对象内存占用(前提回顾)
首先根据以上的计算规则,进行一个简单的验证。使用下面的程序进行验证:
public class Test {
public static void main(String[] args) throws InterruptedException {
TestObject testObject = new TestObject();
Thread.sleep(600 * 1000);
System.out.println(testObject);
}
}
class Test