温馨提示×

温馨提示×

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

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

java弱引用何时回收

发布时间:2026-09-20 19:55:31 来源:亿速云 阅读:97 作者:小樊 栏目:编程语言

在 Java 中,**弱引用(WeakReference)**的回收时机可以概括为:

当垃圾回收器(GC)运行时,只要对象只被弱引用关联(没有任何强引用),该对象就会被回收。

下面分点说明:


1. 弱引用的基本回收规则

  • 如果一个对象 只有弱引用指向它(没有强引用、没有软引用)
  • 那么 下一次 GC 发生时,这个对象一定会被回收
  • 回收后,弱引用会被加入关联的 ReferenceQueue(如果有的话)

示例:

Object obj = new Object();
WeakReference<Object> weakRef = new WeakReference<>(obj);

obj = null; // 去掉强引用

// 此时只有 weakRef 指向对象
// GC 发生后,对象可能被回收
System.gc();

2. 回收发生在“GC 时”,不是“立即”

  • 弱引用 不会自动立刻回收
  • 而是在 JVM 进行垃圾回收时 才判断并回收
  • 具体 GC 时机由 JVM 决定(Young GC / Full GC)

⚠️ 注意:

obj = null;
// 不保证马上回收

即使没有强引用,也可能暂时还在内存中。


3. 与强引用、软引用的对比

引用类型 回收条件
强引用 永不回收(直到无引用)
软引用 内存不足时回收
弱引用 下次 GC 就回收
虚引用 随时可能回收(仅用于跟踪)

4. 典型使用场景

  • WeakHashMap
    • key 是弱引用
    • key 没有强引用后,entry 会被自动移除
  • 缓存(短期缓存)
  • 监听器、回调防止内存泄漏

5. 如何感知弱引用对象被回收?

使用 ReferenceQueue:

ReferenceQueue<Object> queue = new ReferenceQueue<>();
WeakReference<Object> ref = new WeakReference<>(new Object(), queue);

// GC 后
Reference<?> removed = queue.poll(); // 可感知回收

6. 常见误区

❌ 弱引用对象“创建后就很快消失”
✅ 实际是:只要 GC 发生且无可达强引用,才会回收

❌ System.gc() 一定立刻回收
✅ 只是“建议”GC,不保证


如果你愿意,我也可以结合 WeakHashMap 源码 或 ThreadLocal 中的弱引用 给你讲具体回收过程。

向AI问一下细节

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

AI
助
手