【JVM】面试题-对象的内存布局


对象在堆内存的存储布局,可分为对象头、实例数据和对⻬填充

1、对象头

占 12B,包括对象标记和类型指针。

复制代码
======= 🌟 青柠来相伴,代码更简单。🌟 =======
📚 本文所有内容,我都整理在了 青柠合集 里。👇
🎯 搜索关注【青柠代码录】,即可查看所有合集文章 ~
======= 🌟 ================== 🌟 =======

对象标记

存储对象⾃身的运⾏时数据,如哈希值、 GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等,这部分占8B,称为Mark Word。

复制代码
Mark Word (64 bits)                                            State
--------------------------------------------------------------------------------
unused:25 | hashcode:31 | age:4 | biased_lock:0 | 01            Normal
--------------------------------------------------------------------------------
thread:54 | epoch:2 | age:4 | biased_lock:1     | 01            Biased
--------------------------------------------------------------------------------
ptr_to_lock_record:62                           | 00            Lightweight Locked
--------------------------------------------------------------------------------
ptr_to_heavyweight_monitor:62                   | 10            Heavyweight Locked
--------------------------------------------------------------------------------
                                                | 11            Marked for GC

对象状态

  • 【无锁状态】:对象哈希值---GC分代年龄---是否是偏向锁---锁标志位
  • 【偏向锁】:偏向线程ID---epoch---GC分代年龄---是否是偏向锁---锁标志位
  • 【轻量级锁】:指向栈中锁记录的指针---锁标志位
  • 【重量级锁】:指向互斥量(重量级锁/monitor)的指针---锁标志
  • 【GC标记】:空

Mark Word 被设计为动态数据结构,以便在极⼩的空间,存储更多数据,根据对象状态,复⽤存储空间。

类型指针

是对象指向它的类型元数据的指针,占 4B。

JVM 通过该指针,来确定对象是哪个类的实例。

说明:如果是数组,还需记录数组的长度

2、实例数据

是对象真正存储的有效信息,即本类对象的实例成员变量,和所有可⻅的⽗类成员变量。

存储顺序会受到虚拟机分配策略参数,和字段在源码中定义顺序的影响。

相同宽度的字段总是被分配到⼀起存放,在满⾜该前提条件的情况下,⽗类中定义的变量,会出现在⼦类之前。

3、对⻬填充

不是必然存在的,也没特别含义,仅起占位符作⽤。

虚拟机的⾃动内存管理系统,要求任何对象的⼤⼩必须是8B的倍数,对象头已被设为 8B 的 1 或 2 倍,如果对象实例数据部分没有对⻬,需要对⻬填充补全。

复制代码
public class CustomerTest {
    public static void main(String[] args) {
        Customer cust = new Customer();
    }
}

img

此处字符串常量池逻辑上属于方法区,hotspot实现在堆空间中

相关推荐
磁爆步兵8 小时前
内存分区:程序运行的核心秘密
java·开发语言·jvm
讓丄帝愛伱10 小时前
JVM线上故障快速排
jvm
落苜蓿蓝10 小时前
Java 循环中对象复用导致属性覆盖?从 JVM 内存模型讲解原因
java·jvm·python
一只专注api接口开发的技术猿10 小时前
OpenClaw 实战:搭建京东商品监控与简易数据分析脚本
大数据·jvm·数据库·oracle·数据分析
Tim_101 天前
【C++】021、RAII
jvm
格兰芬多呼神护卫1 天前
# Agent 企业评估方案深度分析:从“看答案”到持续质量闭环_码士教育
java·开发语言·jvm
CodeStats1 天前
【Java GC】Java JVM 垃圾回收(GC)完全指南:从内存结构到并发回收的底层原理
java·jvm·gc·垃圾回收·zgc·内存结构
ChaHae-In1 天前
JVM运行时数据区与垃圾回收
jvm
IKUN家族2 天前
Spring JVM(二)
java·jvm·spring
程序员天天困2 天前
Arthas ognl 表达式从入门到实战:掌握在线调试最强的表达式引擎
java·jvm·后端