温馨提示×

温馨提示×

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

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

java弱引用如何工作

发布时间:2026-09-20 18:53:27 来源:亿速云 阅读:100 作者:小樊 栏目:编程语言

在 Java 中,**弱引用(Weak Reference)**是 java.lang.ref.WeakReference 提供的一种引用类型,属于 四种引用强度 中的一种(强 > 软 > 弱 > 虚)。

下面从「工作方式」「生命周期」「使用场景」三个层面说明。


一、弱引用如何工作(核心机制)

1. 基本定义

WeakReference<T> ref = new WeakReference<>(new Object());
  • 你创建的对象被 WeakReference 包装
  • 该对象 没有强引用 时,就可能被回收

2. GC 行为(关键点)

只要发生垃圾回收(GC),弱引用指向的对象就会被回收

即使内存还很充足,也会回收。

示例:

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

obj = null; // 去掉强引用

System.gc();
// 下一次 GC 后
System.out.println(wr.get()); // 很可能为 null

二、弱引用的生命周期

强引用存在 → 对象不会被回收
强引用消失 → 下次 GC 时对象被回收
WeakReference.get() → 返回对象或 null

引用队列(ReferenceQueue)

弱引用常配合 ReferenceQueue 使用:

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

当对象被回收后:

  • WeakReference 本身会被放入队列
  • 可用于清理关联资源

三、典型使用场景

1. WeakHashMap(最常见)

WeakHashMap<Key, Value> map = new WeakHashMap<>();
  • Key 是弱引用
  • Key 被 GC 后,对应 Entry 自动移除

✅ 适合:缓存、监听器管理


2. 防止内存泄漏

例如:

  • 监听器
  • 回调对象
  • 线程局部缓存

用弱引用持有对象,避免长期占用内存。


3. 缓存(短生命周期)

  • 不重要的缓存数据
  • 允许随时被回收

四、弱引用 vs 软引用

类型 回收时机 用途
强引用 不回收 普通对象
软引用 内存不足时 内存敏感缓存
弱引用 下次 GC 自动清理、Map Key
虚引用 随时 对象回收通知

五、注意事项

❌ 弱引用 不能阻止 GC ❌ get() 可能随时返回 null ✅ 使用前应判空

Object o = wr.get();
if (o != null) {
    // 使用对象
}

如果你愿意,我也可以:

  • 用 图示 解释引用关系
  • 对比 ThreadLocal 中的弱引用
  • 分析 WeakHashMap 源码级别行为

你想深入哪一块?

向AI问一下细节

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

AI
助
手