温馨提示×

温馨提示×

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

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

java弱引用怎么使用

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

在 Java 中,**弱引用(WeakReference)**是一种比软引用更“弱”的引用类型,它的特点是:

只要 GC 发生,无论内存是否充足,被弱引用关联的对象都会被回收。


一、WeakReference 基本用法

1️⃣ 创建弱引用

import java.lang.ref.WeakReference;

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

obj = null; // 去掉强引用

// 此时对象只被弱引用关联

2️⃣ 获取对象

Object o = weakRef.get();
if (o != null) {
    // 对象还没被回收
} else {
    // 对象已被 GC 回收
}

二、典型使用场景

✅ 场景 1:缓存(防止内存泄漏)

弱引用常用于不阻止对象回收的缓存。

Map<Key, WeakReference<Value>> cache = new HashMap<>();

但更推荐直接用 JDK 提供的:

WeakHashMap<Key, Value> map = new WeakHashMap<>();

WeakHashMap 的 key 是弱引用,key 被 GC 后,对应 entry 会自动移除。


✅ 场景 2:监听器 / 回调(避免内存泄漏)

比如在 Android 或 GUI 中:

class Listener {
    WeakReference<Activity> activityRef;

    Listener(Activity activity) {
        activityRef = new WeakReference<>(activity);
    }

    void onEvent() {
        Activity activity = activityRef.get();
        if (activity != null) {
            activity.update();
        }
    }
}

✅ 场景 3:ThreadLocal(JDK 内部使用)

ThreadLocalMap 中的 key 就是弱引用,防止线程不结束时导致内存泄漏。


三、WeakReference + ReferenceQueue(高级用法)

当弱引用对象被回收时,可以收到通知:

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

// GC 后
Reference<?> polled = queue.poll();
if (polled != null) {
    // 对象已被回收
}

常用于:

  • 清理资源
  • 监控对象生命周期

四、弱引用 vs 其他引用对比

引用类型 GC 行为 用途
强引用 不回收 普通对象
软引用 内存不足时回收 内存敏感缓存
弱引用 下次 GC 必回收 防内存泄漏
虚引用 随时可能回收 跟踪回收状态

五、注意事项 ⚠️

  1. 弱引用不等于自动清理
    • 必须主动 get() 判断
  2. WeakHashMap 的 value 仍是强引用
  3. 不适合做主缓存(可能随时消失)

如果你有具体使用场景(比如缓存 / Android / ThreadLocal / JVM 原理),我可以给你更针对性的示例。

向AI问一下细节

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

AI
助
手