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

【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)。

相关文章:

  • Redis的分布式锁
  • [ABC400F] Happy Birthday! 3 题解
  • Web渗透之XSS注入
  • LeetCode 255 超通俗讲解:Swift 验证前序是否 BST
  • 【经济保护主义叙事】
  • QQ风格客服聊天窗口
  • 英国股票实时API 对比:iTick的差异化优势解析
  • 机器学习(3)——决策树
  • AI证件照生成API:快速创建证件照
  • 游戏引擎学习第220天
  • ssh 免密登录服务器(vscode +ssh 免密登录)
  • 吃透LangChain,我的理解像Java的Spring
  • 2025最新系统 Git 教程(七)(完结)
  • 零基础上手Python数据分析 (12):DataFrame 数据清洗与预处理 (下) - 类型转换、格式化、文本与日期处理
  • 从0到1构建企业级消息系统服务体系(一):产品架构视角下的高并发设计与动态响应能力建设
  • 猫咪如厕检测与分类识别系统系列【三】融合yolov11目标检测
  • cdp-(Chrome DevTools Protocol) browserscan检测原理逆向分析
  • AVUE 搜索 和 表单 标签分开对齐方式
  • Python与R语言用XGBOOST、NLTK、LASSO、决策树、聚类分析电商平台评论信息数据集
  • Linux安装yum和python
  • 外贸建站与推广如何做 google/百度导航如何设置公司地址
  • 学徒制下的课程网站建设/百度平台推广
  • 自建网站怎么做优化/百度网址链接
  • 汕头市营商环境建设监督局网站/企业网站怎么推广
  • 电商网站建设报价单/软文推广经典案例
  • 网站设计与wap网站开发技术/seo教学网seo