Java对象在其生命周期各阶段具体都做了哪些事情

第一阶段:类加载阶段(Class Loading Phase)

定义:使用classLoader装载类到jvm的过程

子阶段具体操作涉及内容发生时机备注
加载(Loading)
  • 通过类名获取二进制字节流
  • 将字节流转换为方法区的运行时数据结构
  • 在内存中生成Class对象
  •  .class文件读取
  • 类元数据创建
  • Class对象创建
类首次被引用时由类加载器完成
连接-验证(Verification)
  • 文件格式验证
  • 元数据验证
  • 字节码验证
  • 符号引用验证
  • 字节码合法性检查
  • 类型安全检查
加载后立即进行确保类的安全性
连接-准备(Preparation)
  • 为静态变量分配内存
  • 设置静态变量默认值
  • static变量内存分配
  • 默认零值设置
验证通过后不执行赋值语句
连接-解析(Resolution)
  • 符号引用转为直接引用
  • 解析类、接口、字段、方法引用
  • 常量池符号引用
  • 内存地址绑定
可延迟到使用时可选择性执行

第二阶段:类初始化阶段(Class Initialization Phase)

定义:执行类的<clinit>()方法,为静态变量赋予真实的初始值,执行静态代码块。这是类级别的初始化,不是对象级别的,且一个类在一个类加载器中只会被初始化一次。该阶段也是java类加载过程的最后一个阶段。

操作项目具体执行内容执行顺序发生时机特点
静态变量赋值
  • 执行静态变量的显式赋值
  • 调用静态初始化方法
按代码出现顺序类首次主动使用时只执行一次
静态代码块执行
  • 执行static{}代码块
  • 可能修改静态变量值
与静态变量赋值交替类首次主动使用时只执行一次
父类初始化
  • 先初始化父类
  • 再初始化子类
父类优先子类初始化前递归向上执行

示例执行顺序:

private static String var1 = "初始值1"; // 1
static { var1 = "代码块修改"; }// 2 
private static String var2 = "初始值2"; // 3

第三阶段:对象实例化阶段(Object Instantiation Phase)

定义:在堆内存中分配空间并创建对象的基本结构,但不执行任何自定义初始化代码

步骤操作项目具体执行内容内存操作时机说明
1类加载检查
  • 检查类是否已加载
  • 触发类初始化(如需要)
无内存分配new指令执行时
2内存分配
  • 计算对象所需内存大小
  • 在堆中分配连续内存空间
  • 指针碰撞或空闲列表方式
对象内存分配类检查通过后
3内存初始化零值
  • 所有实例字段设为零值
  • 引用类型设为null
  • 基本类型设为默认值
实例数据区初始化内存分配后立即
4设置对象头
  • 设置Mark Word
  • 设置类型指针
  • 设置数组长度(如果是数组)
对象头区设置零值初始化后
5对齐填充计算
  • 确保对象大小是8字节倍数
  • 在内存分配时已考虑
对齐填充区内存分配时确定

对象内存布局三部分设置详情

内存区域设置时机具体内容大小
对象头(Object Header)步骤4
  • Mark Word(运行时数据)
  • 类型指针(Klass Pointer)
  • 数组长度(数组对象)

mark word :32位占4字节,64位占8字节

类型指针:jvm开启压缩占4字节,未开启占8字节
数组长度:4字节(仅数组对象时存在)

实例数据(Instance Data)

步骤3(零值)

步骤6(对象初始化-实例变量赋值)

  • 成员变量存储
  • 按照声明顺序或优化后顺序
变长
对齐填充(Padding)步骤2(分配时)
  • 补齐到8字节倍数
  • 可能为0字节

第四阶段:对象初始化阶段(Object Initialization Phase)

定义:执行自定义的初始化逻辑,使对象从"空白状态"变为"可用状态",即执行<init>方法,注意:构造函数不等于<init>方法

步骤操作项目具体执行内容作用范围执行特点
6实例变量赋值
  • 执行成员变量的显式赋值
  • 覆盖之前的零值
当前对象实例每次创建对象都执行
7实例代码块执行
  • 执行{}代码块
  • 可能修改实例变量值
当前对象实例每次创建对象都执行
8构造函数执行
  • 执行构造器代码
  • 完成对象最终初始化
当前对象实例每次创建对象都执行

实例初始化执行顺序:

private String var1 = "实例变量1";     // 6
{ var1 = "实例代码块修改"; }           // 7
public MyClass() {                    // 8
    var1 = "构造函数修改";
}

第五阶段:对象使用阶段(Object Usage Phase)

阶段对象状态主要特征内存状态
创建完成对象可用
  • 所有字段已正确初始化
  • 可以被正常使用
堆内存中存活
强引用期活跃使用
  • 有强引用指向对象
  • 不会被GC回收
堆内存中存活
作用域结束引用失效
  • 局部变量超出作用域
  • 但对象可能仍被其他引用
可能变为不可达

第六阶段:垃圾回收阶段(Garbage Collection Phase)

步骤阶段名称具体操作触发条件结果
1不可达判定
  • GC Roots可达性分析
  • 标记不可达对象
没有GC Roots路径标记为垃圾
2终结判定
  • 检查是否重写finalize()
  • 加入终结队列
对象有finalize()方法可能复活
3终结执行
  • 执行finalize()方法
  • 二次标记检查
在Finalizer线程中最后拯救机会
4内存回收
  • 释放对象占用内存
  • 内存空间归还堆
确认不可达后内存释放

完整时间线总结

类加载阶段 → 类初始化阶段 → 对象创建 → 对象初始化 → 对象使用 → 垃圾回收

 ↓        ↓          ↓       ↓        ↓       ↓

加载类信息  静态内容初始化  分配内存  实例内容初始化  正常使用  内存释放

(一次性)    (一次性)     (每次创建)  (每次创建)   (使用期间)  (GC时)

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值