当前位置: 首页 > news >正文

【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
img

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

http://www.jsqmd.com/news/790416/

相关文章:

  • 3分钟搞定Calibre电子书元数据:豆瓣插件完全指南
  • 软件工程面向对象相关知识
  • JSBSim飞行动力学引擎:如何构建高精度六自由度飞行仿真系统?
  • 2025年八大网盘直链下载助手:LinkSwift完整使用指南
  • 微信聊天记录永久保存指南:用WeChatMsg打造你的数字记忆库
  • 9大主流网盘直链解析工具的技术实现与应用分析
  • Python实战:5分钟搞定无人机照片EXIF信息提取(含经纬度、高度、偏角)
  • 在Nodejs后端服务中集成Taotoken实现多模型智能回复功能
  • 中小团队如何利用Taotoken统一管理多项目API成本
  • 避坑指南:在RT-Thread上玩转BH1750光传感器,我遇到的几个坑和解决方法(附完整代码)
  • 零门槛Vue Office文档预览终极指南:快速集成多格式文件预览方案
  • 八大网盘直链解析神器:告别下载限速,开启全速下载新时代
  • 3分钟搞定Windows和Office激活:智能脚本的终极使用指南
  • 从Vivado到专业EDA:Linux下VCS与Verdi高效仿真调试全流程解析
  • FUXA:零代码Web SCADA/HMI系统如何解决工业可视化三大核心挑战
  • LinkSwift:一站式智能网盘直链解析解决方案
  • 从账单明细看Taotoken按Token计费模式如何助力项目成本分析
  • 调AI接口总崩?前端错误处理不该只是catch一下
  • 创业公司如何利用 Taotoken 低成本试验多种大模型能力
  • CloudCompare入门指南:从零开始掌握点云可视化与基础操作
  • Python开发者如何快速接入Taotoken调用多款大模型API
  • SITS2026门票已售罄63%,但仍有3条官方未公告的免费入场通道(附实操路径)
  • Translumo与Lookupper技术选型对比:实时屏幕翻译开源工具分析
  • 三步完成Calibre电子书元数据自动化管理:calibre-douban插件完全指南
  • LLM服务上线周期从72小时压缩至11分钟,SITS2026实战路径全公开,含可复用的GitOps策略模板
  • 告别毕业论文噩梦:百考通AI如何用四步闭环,让本科论文“一次过关”
  • 3步搞定黑苹果配置:OpenCore Configurator终极图形化方案
  • 【2026搜索架构生死线】:SITS原生语义引擎对ES/Opensearch/Solr的兼容性矩阵与3种渐进式替换方案
  • 3步解锁视频字幕智能提取:本地化AI工具的完整实践指南
  • 网盘直链下载助手:告别限速烦恼,轻松获取真实下载链接