温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

java对象怎么回收

发布时间:2026-10-30 16:55:52 来源:亿速云 阅读:89 作者:小樊 栏目:编程语言

在 Java 中,对象回收主要由 JVM 的垃圾回收机制(GC,Garbage Collection) 自动完成。下面从「什么时候回收」「怎么判定可回收」「回收过程」「如何主动影响回收」几个方面说明。


一、Java 对象是如何被回收的?

1️⃣ 对象什么时候会被回收?

当一个对象“不可达”时,才可能被判为垃圾对象。

不可达指的是:

  • 没有任何 强引用(Strong Reference) 指向该对象
  • 从 GC Roots 出发无法访问到该对象

2️⃣ 什么是 GC Roots?

常见 GC Roots 包括:

  • 虚拟机栈(栈帧中的局部变量)
  • 方法区中的静态变量
  • 方法区中的常量
  • 本地方法栈中 JNI 引用的对象
  • 活跃线程对象

二、对象是否可回收的判定方式

✅ 1. 引用计数法(Java 不用)

  • 缺点:无法解决循环引用问题
  • Java 不使用

✅ 2. 可达性分析(Java 使用)

GC Roots → 引用链 → 对象

如果对象不在引用链上 → 可回收


三、Java 中的引用类型(影响回收)

引用类型 特点 是否容易被回收
强引用 Object o = new Object() 不回收
软引用 SoftReference 内存不足时回收
弱引用 WeakReference 下次 GC 就回收
虚引用 PhantomReference 仅用于跟踪回收

四、对象回收的过程(简化版)

1️⃣ 标记(Mark)

  • 从 GC Roots 开始标记存活对象

2️⃣ 筛选(Finalize)

  • 如果对象重写了 finalize():
    • 第一次 GC:放入 F-Queue
    • 第二次 GC:才真正回收(不推荐依赖)

3️⃣ 清除 / 整理

  • 清除垃圾对象
  • 整理内存(如标记-整理算法)

五、常见垃圾回收算法

  • 标记-清除
  • 复制算法(新生代)
  • 标记-整理(老年代)
  • 分代收集(主流 JVM)

六、堆内存分代与回收

区域 特点 回收频率
新生代 对象生命周期短 高
老年代 大对象、长期存活 低
永久代 / 元空间 类信息等 很少

七、是否可以“主动”回收对象?

❌ 不能强制回收

System.gc(); // 只是“建议”JVM 进行 GC

✅ 能做的是:

  • 解除引用
obj = null;
  • 使用弱引用
  • 合理释放资源(IO、连接等)

八、常见误区

❌ 对象 = null 就立刻回收
✅ 只是“可能”变得可回收

❌ finalize() 一定执行
✅ 不保证执行,也不推荐使用


九、总结一句话

Java 对象回收 = JVM 自动通过可达性分析,回收无强引用、不可达的对象

如果你愿意,我也可以:

  • 画一张 GC 流程图
  • 讲 System.gc() 的真实行为
  • 结合你使用的 JDK 版本(如 JDK 8 / 17)讲 G1 / ZGC
向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手