Object类在GC中无特殊地位,JVM统一通过可达性分析判定所有对象存活状态,仅依据是否能从GC Roots(如栈中变量、静态引用等)经引用链到达,与继承关系或类名无关。

Object 类本身不会被特别“识别追踪”——JVM 不按类名(比如 Object)来判断对象是否可回收,而是统一通过可达性分析判定所有对象的存活状态,无论它是不是 Object 或其子类实例。
Object 类在 GC 中没有特殊地位
Java 中所有类都默认继承自 Object,但这只是语言层面的约定。JVM 垃圾回收器不关心类的继承关系,也不检查某个对象是不是 Object 实例。它只看:
这个对象是否能从一组固定的起点(GC Roots)出发,通过引用链访问到。
GC Roots 是关键入口点
标记阶段从以下位置开始遍历引用链,这些就是 GC Roots:
- 虚拟机栈(栈帧中的局部变量表)里引用的对象
- 本地方法栈中 JNI(即 Native 方法)引用的对象
- 方法区中类静态变量引用的对象
- 方法区中常量池引用的对象(如字符串常量)
- 被同步锁(
synchronized)持有的对象 - JVM 内部特殊对象,如基本类型数组、系统类加载器等
只要一个对象(哪怕只是 new Object() 创建的最简实例)能从任一 GC Root 出发、沿引用链到达,它就被标记为“存活”,不会进入清除阶段。
立即学习“Java免费学习笔记(深入)”;
标记清除阶段不区分对象类型
一旦完成可达性分析,JVM 对所有未被标记的对象执行统一处理:
- 在标记-清除算法中:直接释放其占用的堆内存空间,不调用
finalize()(该方法已废弃)或任何Object方法 - 在复制或标记-整理算法中:仅移动或清理内存块,同样不基于类名做判断
-
Object类定义的hashCode()、equals()、toString()等方法,与 GC 过程完全无关
为什么有人误以为 Object 类参与 GC?
常见误解来源:
- 把“所有对象都继承 Object”等同于“GC 会专门处理 Object”——实际是继承关系不影响 GC 逻辑
- 看到
Object.finalize()(已弃用)曾用于资源清理,误以为它是 GC 的一部分——现代 JVM 已忽略该方法,且不依赖它判断对象生死 - 混淆了类加载机制(如
Object.class由 Bootstrap ClassLoader 加载)和运行时对象生命周期管理——前者管“类怎么进来”,后者管“实例怎么走”


















