<dependency>
<groupId>org.openjdk.jol</groupId>
<artifactId>jol-core</artifactId>
<version>0.16</version>
</dependency>
对象的内存布局分为两种,普通对象和数组对象
普通对象
普通对象有四部分组成对象头(MarkWord)、ClassPointer指针、实例数据、Padding对齐
对象头(MarkWord)
对象头固定占用8个字节
ClassPointer指针
ClassPointer指针指向Class对象,默认指针压缩是被开启的,占用4个字节,配置JVM参数-XX:+UseCompressedOops后,占用8个字节
实例数据
成员变量占用的空间
数据类型 | 占用空间 |
---|---|
byte | 1个字节 |
short | 2个字节 |
int | 4个字节 |
long | 8个字节 |
float | 4个字节 |
double | 8个字节 |
char | 2个字节 |
boolean | 1个字节 |
对象引用 | 对象指针压缩默认是被开启的,占用4个字节,配置JVM参数-XX:+UseCompressedOops后,占用8个 |
Padding对齐
如果对象占用内存的大小不是8的倍数,会多占用一部分空间,补齐成8的倍数
示例
public static class Test{
public String str;
public int num;
}
public static void main(String[] args) {
System.out.println(ClassLayout.parseInstance(new Test()).toPrintable());
}
运行结果(SZ:占用空间的字节数):
OFF SZ TYPE DESCRIPTION VALUE
0 8 (object header: mark) 0x0000000000000005 (biasable; age: 0)// 对象头
8 4 (object header: class) 0x00067248 // ClassPointer指针
12 4 int Test.num 0 // 成员变量
16 4 java.lang.String Test.str null // 成员变量
20 4 (object alignment gap) // Padding对齐
Instance size: 24 bytes // 共占用24个字节
Space losses: 0 bytes internal + 4 bytes external = 4 bytes total
Process finished with exit code 0
数组对象
数组对象有五部分组成对象头(MarkWord)、ClassPointer指针、数组长度、数组数据、Padding对齐
对象头(MarkWord)
与普通对象相同,固定占用8个字节
ClassPointer指针
ClassPointer与普通对象相同,也是指针指向Class对象,默认指针压缩是被开启的,占用4个字节,配置JVM参数-XX:+UseCompressedOops后,占用8个字节
数组长度
固定占用4个字节,存储数组长度
数组数据
数据类型不同,数组长度不同,占用空间不同
数据类型 | 占用空间 |
---|---|
byte | 1个字节 |
short | 2个字节 |
int | 4个字节 |
long | 8个字节 |
float | 4个字节 |
double | 8个字节 |
char | 2个字节 |
boolean | 16个字节 |
对象引用 | 对象指针压缩默认是被开启的,占用4个字节,配置JVM参数-XX:+UseCompressedOops后,占用8个 |
Padding对齐
如果对象占用内存的大小不是8的倍数,会多占用一部分空间,补齐成8的倍数
示例
public static void main(String[] args) {
int[] nums = new int[5];
nums[0]=1;
nums[1]=2;
System.out.println(ClassLayout.parseInstance(nums).toPrintable());
}
运行结果(SZ:占用空间的字节数)
[I object internals:
OFF SZ TYPE DESCRIPTION VALUE
0 8 (object header: mark) 0x0000000000000001 (non-biasable; age: 0)// 对象头
8 4 (object header: class) 0x00000c10 // ClassPointer指针
12 4 (array length) 5 // 数组长度
12 4 (alignment/padding gap) // Padding对齐
16 20 int [I.<elements> N/A // 数组数据
36 4 (object alignment gap) // Padding对齐
Instance size: 40 bytes
Space losses: 4 bytes internal + 4 bytes external = 8 bytes total
Process finished with exit code 0