Java对象生命周期始于类加载完成,终于垃圾回收清除,历经创建、使用、不可达、回收四阶段;类加载含加载、验证、准备、解析、初始化五步,初始化后方可new实例;实例化时分配堆内存、设对象头、默认初始化字段,再执行父类构造器→字段显式初始化→构造体;强可达时对象可正常使用;不可达后经GC标记清除,现代JVM通常跳过finalize直接回收。

Java对象的生命周期从类加载开始,到对象被垃圾回收器彻底清除结束,中间经历创建、使用、不可达、回收等关键阶段。理解这些阶段有助于写出更健壮、内存友好的代码。
类加载与准备阶段
对象诞生前,其所属类必须先被JVM加载、验证、准备、解析和初始化。这个过程由类加载器完成,只有当类初始化完成后(比如执行了static块),才能通过new指令创建实例。此时,对象尚未存在,但类的静态资源已就绪。
对象实例化与初始化阶段
调用new关键字后,JVM在堆中分配内存,设置对象头(含哈希码、GC分代年龄、锁状态等),再执行实例变量默认初始化(如int→0,Object→null)。最后按顺序执行:父类构造器 → 当前类字段显式初始化 → 构造方法体。这一阶段结束,对象才真正“可用”。
对象使用与可达性维持阶段
对象被至少一个活动线程或GC Roots(如栈帧局部变量、静态字段、JNI引用等)直接或间接引用时,即处于“强可达”状态。它可正常参与业务逻辑、被多次调用、修改状态。只要引用链未断,即使长时间不访问,也不会被回收。
立即学习“Java免费学习笔记(深入)”;
不可达判定与垃圾回收阶段
当对象不再被任何GC Roots可达时,进入“不可达”状态。JVM会在下一次GC周期中将其标记为可回收对象。若该类重写了finalize()方法(已废弃,不推荐使用),且此前未执行过,会先放入F-Queue队列等待最终确定;否则直接进入回收队列。现代JVM(如ZGC、Shenandoah)大多跳过finalize流程,对象在标记-清除/整理后立即释放内存。










