java对象的内存布局以及使用ClassLayout查看布局
pom依赖
<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的倍数
示例
import org.openjdk.jol.info.ClassLayout;
/**
* @author JHL
* @version 1.0
* @since : JDK 11
*/
public 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)
// ClassPointer指针
8 4 (object header: class) 0x00067248
// 成员变量
12 4 int Test.num 0
// 成员变量
16 4 java.lang.String Test.str null
// Padding对齐
20 4 (object alignment gap)
// 共占用24个字节
Instance size: 24 bytes
Space losses: 0 bytes internal + 4 bytes external = 4 bytes total
数组对象
数组对象有五部分组成对象头(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());
}
OFF SZ TYPE DESCRIPTION VALUE
// 对象头
0 8 (object header: mark) 0x0000000000000001 (non-biasable; age: 0)
// ClassPointer指针
8 4 (object header: class) 0x00000c10
// 数组长度
12 4 (array length) 5
// 数组数据
16 20 int [I.<elements> N/A
// Padding对齐
36 4 (object alignment gap)
Instance size: 40 bytes
Space losses: 4 bytes internal + 4 bytes external = 8 bytes total