第一阶段:类加载阶段(Class Loading Phase)
定义:使用classLoader装载类到jvm的过程
| 子阶段 | 具体操作 | 涉及内容 | 发生时机 | 备注 |
|---|---|---|---|---|
| 加载(Loading) |
|
| 类首次被引用时 | 由类加载器完成 |
| 连接-验证(Verification) |
|
| 加载后立即进行 | 确保类的安全性 |
| 连接-准备(Preparation) |
|
| 验证通过后 | 不执行赋值语句 |
| 连接-解析(Resolution) |
|
| 可延迟到使用时 | 可选择性执行 |
第二阶段:类初始化阶段(Class Initialization Phase)
定义:执行类的<clinit>()方法,为静态变量赋予真实的初始值,执行静态代码块。这是类级别的初始化,不是对象级别的,且一个类在一个类加载器中只会被初始化一次。该阶段也是java类加载过程的最后一个阶段。
| 操作项目 | 具体执行内容 | 执行顺序 | 发生时机 | 特点 |
|---|---|---|---|---|
| 静态变量赋值 |
| 按代码出现顺序 | 类首次主动使用时 | 只执行一次 |
| 静态代码块执行 |
| 与静态变量赋值交替 | 类首次主动使用时 | 只执行一次 |
| 父类初始化 |
| 父类优先 | 子类初始化前 | 递归向上执行 |
示例执行顺序:
private static String var1 = "初始值1"; // 1
static { var1 = "代码块修改"; }// 2
private static String var2 = "初始值2"; // 3
第三阶段:对象实例化阶段(Object Instantiation Phase)
定义:在堆内存中分配空间并创建对象的基本结构,但不执行任何自定义初始化代码
| 步骤 | 操作项目 | 具体执行内容 | 内存操作 | 时机说明 |
|---|---|---|---|---|
| 1 | 类加载检查 |
| 无内存分配 | new指令执行时 |
| 2 | 内存分配 |
| 对象内存分配 | 类检查通过后 |
| 3 | 内存初始化零值 |
| 实例数据区初始化 | 内存分配后立即 |
| 4 | 设置对象头 |
| 对象头区设置 | 零值初始化后 |
| 5 | 对齐填充计算 |
| 对齐填充区 | 内存分配时确定 |
对象内存布局三部分设置详情
| 内存区域 | 设置时机 | 具体内容 | 大小 |
|---|---|---|---|
| 对象头(Object Header) | 步骤4 |
|
mark word :32位占4字节,64位占8字节 类型指针:jvm开启压缩占4字节,未开启占8字节 |
| 实例数据(Instance Data) |
步骤3(零值) 步骤6(对象初始化-实例变量赋值) |
| 变长 |
| 对齐填充(Padding) | 步骤2(分配时) |
|
第四阶段:对象初始化阶段(Object Initialization Phase)
定义:执行自定义的初始化逻辑,使对象从"空白状态"变为"可用状态",即执行<init>方法,注意:构造函数不等于<init>方法!
| 步骤 | 操作项目 | 具体执行内容 | 作用范围 | 执行特点 |
|---|---|---|---|---|
| 6 | 实例变量赋值 |
| 当前对象实例 | 每次创建对象都执行 |
| 7 | 实例代码块执行 |
| 当前对象实例 | 每次创建对象都执行 |
| 8 | 构造函数执行 |
| 当前对象实例 | 每次创建对象都执行 |
实例初始化执行顺序:
private String var1 = "实例变量1"; // 6
{ var1 = "实例代码块修改"; } // 7
public MyClass() { // 8
var1 = "构造函数修改";
}
第五阶段:对象使用阶段(Object Usage Phase)
| 阶段 | 对象状态 | 主要特征 | 内存状态 |
|---|---|---|---|
| 创建完成 | 对象可用 |
| 堆内存中存活 |
| 强引用期 | 活跃使用 |
| 堆内存中存活 |
| 作用域结束 | 引用失效 |
| 可能变为不可达 |
第六阶段:垃圾回收阶段(Garbage Collection Phase)
| 步骤 | 阶段名称 | 具体操作 | 触发条件 | 结果 |
|---|---|---|---|---|
| 1 | 不可达判定 |
| 没有GC Roots路径 | 标记为垃圾 |
| 2 | 终结判定 |
| 对象有finalize()方法 | 可能复活 |
| 3 | 终结执行 |
| 在Finalizer线程中 | 最后拯救机会 |
| 4 | 内存回收 |
| 确认不可达后 | 内存释放 |
完整时间线总结
类加载阶段 → 类初始化阶段 → 对象创建 → 对象初始化 → 对象使用 → 垃圾回收
↓ ↓ ↓ ↓ ↓ ↓
加载类信息 静态内容初始化 分配内存 实例内容初始化 正常使用 内存释放
(一次性) (一次性) (每次创建) (每次创建) (使用期间) (GC时)

被折叠的 条评论
为什么被折叠?



