面试tips--JVM(2)--对象创建的过程

一、创建对象的完整过程

1. 类加载检查

  • JVM 遇到 new 指令时,首先去检查这个类 User 是否已经被加载、解析和初始化过。

  • 如果没有,就先执行 类加载过程 (加载 .class 文件到方法区/元空间、创建 Class 对象等)。【这个过程就是加载、验证、准备、解析、初始化】


2. 分配内存

  • JVM 在 堆(Heap) 中为新对象分配内存。

  • 分配方式可能是:

    • 指针碰撞(bump-the-pointer):堆内存规整时,用一个指针往后挪就能完成分配。

    • 空闲列表(free-list):堆内存不规整时,需要维护可用内存块列表来找到一块合适的空间。


3. 内存初始化(零值初始化)

  • 对分配到的内存空间进行 零值初始化,保证对象的实例字段有默认值。

  • 比如:int → 0,Object → null,boolean → false。

  • 这样保证 Java 程序不读到脏数据。


4. 设置对象头

  • JVM 会在对象头中写入信息:

    • 哈希码(可能延迟计算)

    • GC 分代年龄

    • 类的元数据指针(指向方法区中的 Class 对象)

    • 锁信息(偏向锁/轻量级锁/重量级锁)


5. 执行 <init> 方法(构造函数)

  • new 指令会执行对象的构造函数,真正完成对象的初始化。

  • 先执行父类构造方法,再执行子类构造方法。

  • 至此,字段会被赋予程序员写的初始化值(而不是零值)。


6. 返回对象引用

  • new 指令执行完毕后,返回对象在堆中的引用地址。

  • user 变量存放的是这个对象的 引用(指针),而不是对象本身。


二、简化流程图

复制代码
new -> 类加载检查 -> 分配内存 -> 零值初始化 -> 设置对象头 
    -> 调用构造函数 <init> -> 返回引用

三、额外说明

  1. 栈 vs 堆

    • 对象本身存放在堆里;

    • 引用变量(比如 user)在栈帧的局部变量表里,存放堆中对象的地址。

  2. 优化:TLAB(Thread Local Allocation Buffer)

    • 多线程环境下,为了避免内存分配加锁,JVM 会给每个线程分配一小块内存(TLAB)。

    • 绝大多数对象都能在 TLAB 上直接分配,效率非常高。

  3. 逃逸分析 & 栈上分配

    • JIT 优化时,如果发现对象不会逃出方法范围,可以直接在 栈 上分配,而不是堆。

    • 这样方法执行完对象就回收,不需要 GC。


✅ 总结一句话:

Java 创建对象的过程是:

类加载检查 → 堆内存分配 → 零值初始化 → 设置对象头 → 调用构造函数 → 返回引用。

相关推荐
夏幻灵4 小时前
JavaScript this 面试:五种绑定规则、优先级与常见面试陷阱
开发语言·javascript·面试
晒太羊的猫7 小时前
jvm面试题
jvm
时间的拾荒人9 小时前
Qt 界面优化:绘图详解 —— 从基础图形到图片处理
开发语言·qt·面试
沐言人生11 小时前
又一个神级考公脑库-22,375篇真题终于按考点整理了
后端·面试
夜之眷属11 小时前
Core dump 崩溃排查:JVM 宕机后,那份 core 文件怎么用 gdb 还原现场
java·运维·服务器·jvm
for_ever_love__11 小时前
MySQL 高频面试题 30 问:索引、事务、锁、日志、主从与分库分表(MySQL 8.0 版)
java·数据库·spring boot·mysql·spring cloud·面试·总结
救救孩子把12 小时前
Agent面试题-记忆治理-上下文-多Agent协作与工程落地
面试·agent·多agent·agent记忆·agent面试题·上下文治理
用户0942485680312 小时前
第31章:JVM字节码解释器与模板解释器源码路径
java·jvm
泡干脆面就番茄12 小时前
HDFS读写流程与MapReduce原理深度解析(面试高频考点)
hdfs·面试·mapreduce
bksczm13 小时前
0基础面试3
面试·职场和发展