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

详解 JVM 中的对象创建过程:类加载检查、内存分配、初始化的完整流程

类加载检查

当JVM遇到new指令时,首先检查该指令参数能否在常量池定位到类的符号引用,并检查该符号引用代表的类是否已被加载、解析和初始化。若类未被加载,需先执行类加载过程。类加载涉及加载、验证、准备、解析和初始化五个阶段,确保类信息正确载入方法区。

内存分配

通过类加载检查后,JVM为新生对象分配内存。分配方式取决于Java堆是否规整:

  • 指针碰撞:堆内存规整时,使用已用和空闲内存间的指针作为分界点,分配内存即移动指针。
  • 空闲列表:堆内存不规整时,虚拟机维护记录可用内存块的列表,分配时从列表中找到足够大的空间。

选择哪种方式由垃圾收集器是否带有空间压缩能力决定。内存分配需保证线程安全,常用CAS加失败重试或TLAB(线程本地分配缓冲区)机制。

内存空间初始化

内存分配完成后,虚拟机将分配的内存空间初始化为零值(不包括对象头)。这保证了对象的实例字段不赋初始值也能直接使用。若使用TLAB分配,初始化操作可提前至TLAB分配时进行。

对象头设置

JVM对对象头进行必要设置,包括:

  • 存储对象的类元数据指针(通过指针可确定该对象属于哪个类)
  • 哈希码
  • GC分代年龄
  • 锁状态标志等运行时数据

实例数据填充

从类元数据中获取实例字段信息,按照字段顺序进行赋值。字段的排列顺序会受到虚拟机分配策略参数(FieldsAllocationStyle)和字段在源码中定义顺序的影响。

执行构造函数

最后执行实例构造方法<init>,按程序员意愿初始化对象。这一步会调用父类构造方法,完成实例字段的显式初始化。在Java视角,此时对象才完全创建完成。

指针访问方式

对象创建后,虚拟机栈的引用变量通过以下两种方式访问堆中对象:

  • 句柄访问:在堆中划分句柄池,引用变量存储句柄地址,句柄包含对象实例数据和类型数据各自地址
  • 直接指针:引用变量直接存储对象地址,对象内存布局需包含类型数据指针

HotSpot主要使用直接指针方式,减少一次指针定位开销。

http://www.dtcms.com/a/553212.html

相关文章:

  • 千博企业网站管理系统营销旗舰版山东网站seo设计
  • JVM 中的内存泄漏:常见场景(静态集合、线程池)与检测工具(MAT)使用
  • 安徽网站建设公司排名网站外链发布
  • 达梦数据库适配遇到的一些问题
  • 电话交换机软件 3CX iOS 应用 V5.4 Beta 更新
  • 做高端企业网站建设公司北京精兴装饰公司
  • FONE为万帮数字能源打造全面预算管理系统
  • Lua VM 跳转指令设计:条件跳转、无条件跳转的底层逻辑
  • 等级保护标准体系再完善:六项新技术公安行标正式发布
  • 光储充微电网零碳园区解决方案:引领园区能源革命,赋能绿色低碳未来
  • 光储融合与智能监控:新型电力系统下的能源协同与运营创新
  • 新手学做免费网站软件泳衣服饰东莞网站建设
  • 舆情,情感微博系统demo,基于python+qt+nlp,开发语言python,界面库qt,无数据库版,数据来自第三方网站获取,
  • 财务----过账
  • 网站pc端网址和手机端网址建设网站建设worldpress
  • 电力电子技术 第九章——二极管整流器
  • 使用Docker部署ShowDoc接口文档工具
  • 交换机路由器基础(一)基础概念
  • 中国有哪些AI大模型公司
  • K8s 存储核心:一文读懂 PV 和 PVC 的设计逻辑与实践
  • p2p借贷网站开发微信公众号推文制作软件
  • k8s pod oom排查攻略
  • 成都市青羊区城乡建设局网站网页制作用什么软件
  • Unity使用AnimeGANv3实现动漫风格化效果(一)
  • (七)TRPO 算法 PPO 算法
  • RK3568前置知识
  • 逻辑回归正则化强度实验报告:不同 λ 值对模型系数与泛化能力的影响
  • LeetCode每日一题——反转链表
  • 南京市网站叫企业做的网站可不可以自己改主题
  • 怎么查询网站是谁做的seo查询工具网站