请从JVM的角度阐述,Java对象在虚拟机内存中是如何存储的?
考察说明
考察对JVM内存结构和对象在堆中布局的理解。
回答思路
- 【回答框架 1】对象主要存储在堆内存中,其内存布局分为三部分:对象头、实例数据和对齐填充。对象头包含Mark Word和类型指针(若开启压缩指针则可能被压缩),Mark Word存储哈希码、GC分代年龄、锁状态等信息。
- 【回答框架 2】实例数据部分存储对象实际字段值,包括父类字段和子类字段,其排列顺序受字段声明顺序和虚拟机分配策略影响。对齐填充部分用于使对象大小达到8字节的整数倍,非必需,仅当对象大小不满足对齐要求时存在。
- 【回答框架 3】对象引用存储在栈或元空间中,而对象本身在堆中。栈上的局部变量可能持有对象引用,但对象数据在堆。方法区存储类元数据,对象头中的类型指针指向该元数据,以支持运行时类型检查和方法调用。
- 【关键点 1】对象在堆中布局为对象头、实例数据、对齐填充。
- 【关键点 2】对象头包含Mark Word和类型指针,Mark Word存储运行时元数据。
- 【关键点 3】实例数据按字段声明顺序和分配策略排列,父类字段在前。
- 【关键点 4】对齐填充保证对象大小是8字节整数倍。
- 【关键点 5】对象引用在栈或元空间,对象内容在堆。
- 【易错点 1】易忽略对齐填充不是必须部分。
- 【易错点 2】易混淆对象引用与对象本身的存储位置。
- 【易错点 3】易忽视压缩指针影响对象头大小。