对象到底是怎么new出来的
前言:要想理解本文,必须先了解JVM的内存结构
一.创建对象的方式
- new:最常见
- 反射:Class.newInstance()
- 使用clone()
- 反序列化
二.创建对象的步骤(对象在JVM中怎么存储?)
- 判断对象的类是否加载,没加载进行加载
- 为对象分配内存空间
- 内存规整:采用指针碰撞,指针就是空闲内存和使用过的内存的一个分界点,每次有新的对象,指针就向后移动相应大小的内存空间。(内存规整说明采用复制算法/标记压缩算法)
- 内存不规则:空闲列表:JVM维护一个空闲列表,记录哪些内存块可用,有新的对象进入时,,从空闲链表中找到空闲的位置进行分配。
- 说明:采用哪种方式完全取决于垃圾回收器是否使用内存整理的算法
- 处理并发的问题:使用TLAB或者CAS保证原子性
- 初始化分配到的空间:给所有的属性赋初始值
- 设置对象头
- 执行init方法:执行代码层面的构造器,完成初始化。
三.对象的内存布局
下图展示了一个对象分配的全过程:
四.对象的访问定位:
创建对象的目的就是为了使用它,那么JVM是如何通过栈帧中的对象引用访问到其内部的对象实例呢?有2种方式:
句柄访问

直接指针:Hotspot采用
寄语:行动是治愈恐惧的良药,而犹豫、拖延将不断滋养恐惧。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App