java对象的创建过程
主要包括以下几个步骤:
- class loading
- class linking(verification、preparation、resolution)
- class initalizing
- 申请对象内存
- 成员变量赋默认值
- 调用构造方法
- 成员变量顺序赋初始值
- 执行构造方法语句
java对象的内存布局
普通对象
主要分为4部分:
- 对象头 markword 8 字节
- Classpointer指针: -XX:+UseCompressedClassPointer 为4字节,不开启为8字节
- 实例数据:
引用类型:-XX:+UseCompressedOops 为4字节,不开启为8字节 - Padding对齐,8的倍数
数组对象
数组对象相较于普通对象,多了数组长度 4 字节。
例如
Object o = new Object();
占用空间大小为16个字节,markword 8 字节 + ClassPointer (开启压缩4字节(默认),不开启压缩8字节),如果开启压缩则为8+4+4(padding)=16,不开启压缩为 8+8 =16。
int[] array = new int[]{};
占用空间大小为16个字节,markword 8 字节 + ClassPointer (开启压缩4字节(默认),不开启压缩8字节),如果开启压缩则为8+4+4(padding)=16,不开启压缩为 8+8 =16。
int[] array = new int[4];
占用空间大小为16个字节,markword 8 字节 + ClassPointer (开启压缩4字节(默认),不开启压缩8字节),如果开启压缩则为8+4+4(size占用)=16,不开启压缩为 8+8+4(size)+4(padding) =24。
具体试验可以通过java.lang.instrument.Instrumentation的getObjectSize()方法来获取一个对象的大小,感兴趣的可以去尝试下。
对象头
markword 64位: