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

创建对象的步骤

以下是创建对象的具体步骤及详细说明,结合关键流程与原理分析:


1.判断对象是否加载、链接阶段、初始化阶段

类加载检查是对象创建的第一步。当遇到new指令时,虚拟机会检查该指令的参数是否能在常量池中定位到类的符号引用,并检查该类是否已被加载、解析和初始化。若未加载,需先执行类加载过程。

链接分为三个子步骤:

  • 验证:确保类信息符合虚拟机规范,避免安全问题。
  • 准备:为类的静态变量分配内存并设置默认初始值(如int为0)。
  • 解析:将符号引用转换为直接引用(如方法、字段的实际内存地址)。

执行类构造器<clinit>方法,完成静态变量的显式初始化(如static int a = 1;)和静态代码块的合并操作。该阶段仅执行一次。


2.分配对象内存

虚拟机为新生对象分配堆内存,分配方式取决于堆内存是否规整:

  • 指针碰撞(Bump the Pointer):适用于内存规整的情况,通过移动指针划分内存。
  • 空闲列表(Free List):适用于内存不规整,虚拟机维护可用内存块列表。

并发处理
在多线程环境下,可能通过**CAS(Compare-And-Swap)TLAB(Thread Local Allocation Buffer)**避免分配冲突。TLAB为每个线程预先分配一小块内存,对象优先在TLAB中分配。


3.初始化内存空间

将分配的内存空间(不包括对象头)初始化为零值。所有实例变量的默认值被设置(如int为0,booleanfalse),确保对象字段无需额外初始化即可使用。


4.设置对象头

对象头包含两类信息:

  • Mark Word:存储哈希码、GC分代年龄、锁状态标志等。
  • 类型指针:指向类元数据的指针,用于确定对象属于哪个类。

若启用压缩指针(64位JVM),对象头可能包含压缩后的类型指针。


5.执行<init>方法

调用对象的构造方法(即<init>),按程序员定义的代码初始化实例字段和执行构造函数逻辑。此时对象才完全完成创建。

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

相关文章:

  • docker desktop部署本地gitlab服务
  • JVM 知识点
  • 数据结构day7——文件IO
  • MapReduce分布式计算框架:从原理到实战
  • 7.可视化的docker界面——portainer
  • 基于ApachePOI实现百度POI分类快速导入PostgreSQL数据库实战
  • 【C++】备忘录模式
  • 简单聊聊 Flutter 在鸿蒙上为什么可以 hotload ?
  • MySQL 中 InnoDB 存储引擎与 MyISAM 存储引擎的区别是什么?
  • 软件测试-持续集成
  • 嵌入式开发:主频与晶振详解
  • Qt自定义外观详解
  • 24年秋季快手笔试题
  • 哈尔滨服务器租用idc服务商-青蛙云
  • JVM调优实战 Day 15:云原生环境下的JVM配置
  • 【Axure视频教程】大小图轮播
  • 3D 商品展示与 AR 试戴能为珠宝行业带来一些便利?
  • 修改Spatial-MLLM项目,使其专注于无人机航拍视频的空间理解
  • C语言复习:数组和指针
  • 数据结构day5——队列和树
  • 转录组分析流程(三):功能富集分析
  • HakcMyVM-Arroutada
  • Rust 学习笔记:比较数值
  • Prompt生成指南
  • 数据结构与算法--蛇行矩阵问题
  • WPF学习笔记(17)样式Style
  • 【机器学习2】正则化regularizaiton(降低模型过拟合)
  • Http、Ftp、Dns和Dhcp服务器搭建
  • Go 服务如何“主动”通知用户?SSE广播与断线重连实战
  • 从docker-compose快速入门Docker