欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 明星 > 【Hotspot虚拟机创建对象的过程是什么样的?】

【Hotspot虚拟机创建对象的过程是什么样的?】

2025/4/15 11:48:33 来源:https://blog.csdn.net/yanwenwennihao/article/details/147164906  浏览:    关键词:【Hotspot虚拟机创建对象的过程是什么样的?】
1. 类加载检查
  • 触发条件:当遇到 new 指令时,JVM首先检查该指令的参数(类符号引用)是否已在常量池中。
  • 检查内容
    • 类是否已被加载、解析和初始化。
    • 若未加载,则触发类加载过程(加载 → 验证 → 准备 → 解析 → 初始化)。
  • 目的:确保类元数据可用,避免后续操作因类未定义而失败。

2. 内存分配
  • 分配方式
    • 指针碰撞(Bump the Pointer):适用于内存规整的堆(如Serial、ParNew收集器)。
      通过移动指针划分内存,分配速度快(仅需指针移动)。
    • 空闲列表(Free List):适用于内存不规整的堆(如CMS收集器)。
      维护可用内存块列表,分配时搜索足够大的空间。
  • 线程安全
    • TLAB(Thread Local Allocation Buffer):为每个线程预分配堆内存区域,避免CAS竞争。
    • CAS重试:当TLAB不足时,使用CAS同步分配。

3. 初始化零值
  • 操作内容:将对象的内存空间初始化为零值。
    • 基本类型字段:int0booleanfalse
    • 引用类型字段:null
  • 目的:确保对象字段在不显式初始化时也能直接使用。

4. 设置对象头(Object Header)
  • 对象头结构(64位JVM):
    • Mark Word:存储哈希码、GC分代年龄、锁状态(偏向锁/轻量级锁/重量级锁)等信息。
    • Klass Pointer:指向类元数据,确定对象类型。
  • 示例
    |---------------------------|
    |        Mark Word (64位)    |
    |---------------------------|
    |   Klass Pointer (32位)     |
    |---------------------------|
    

5. 执行 <init> 方法
  • 步骤
    1. 初始化父类:递归调用父类构造方法(super())。
    2. 实例变量赋值:按代码顺序执行显式初始化和构造代码块。
    3. 构造器代码:执行用户编写的构造方法逻辑。
  • 目的:完成对象按业务需求的初始化。

内存分配优化策略

策略说明适用场景
TLAB分配线程私有内存区域,减少CAS竞争高频创建小对象的场景
逃逸分析若对象未逃逸方法,可能在栈上分配或标量替换方法内部临时对象(JIT优化)
大对象直接进入老年代避免在新生代频繁复制(通过 -XX:PretenureSizeThreshold 设置阈值)大数组、大字符串等

对象内存布局

区域内容大小(64位JVM)
对象头(Header)Mark Word(锁状态、哈希码等) + Klass Pointer(类元数据指针)12字节(开启压缩指针)
实例数据(Instance Data)对象实际字段值(包括父类继承字段)由字段类型和数量决定
对齐填充(Padding)补齐对象大小为8字节的整数倍0~7字节

常见问题与解决方案

  1. 内存分配失败

    • 触发GC:当Eden区空间不足时,触发Minor GC。
    • OOM处理:若GC后仍无法分配,抛出 OutOfMemoryError
  2. 线程竞争

    • TLAB优化:通过 -XX:+UseTLAB 启用(默认开启),减少CAS冲突。
  3. 对象初始化顺序

    • 字段默认值 → 显式赋值 → 构造器代码:确保初始化符合Java规范。

总结

Hotspot虚拟机通过 类加载检查 → 内存分配 → 初始化 → 对象头设置 → 构造方法调用 的流程创建对象,结合 TLAB、逃逸分析 等优化策略,平衡性能与安全性。理解这一过程有助于优化代码(如减少大对象创建)和排查内存问题(如OOM)。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词