温馨提示×

温馨提示×

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

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

如何用Java弱引用

发布时间:2026-09-01 16:28:30 来源:亿速云 阅读:95 作者:小樊 栏目:编程语言

在 Java 中,**弱引用(WeakReference)**是 java.lang.ref 包下提供的一种引用类型,用来描述“非必需”对象。被弱引用关联的对象,在 下一次垃圾回收(GC)时,无论内存是否足够,都会被回收

下面从概念 → API → 使用示例 → 常见场景逐步说明。


一、Java 中的引用类型回顾

Java 提供 4 种引用强度(由强到弱):

  1. 强引用(Strong Reference):普通 Object o = new Object();
  2. 软引用(SoftReference):内存不足时才回收
  3. 弱引用(WeakReference):GC 来了就回收 ✅
  4. 虚引用(PhantomReference):几乎不用,用于跟踪回收

二、WeakReference 基本用法

1. 创建弱引用

import java.lang.ref.WeakReference;

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

2. 获取对象

Object ref = weakRef.get();
if (ref != null) {
    // 对象还存在
}

3. 对象被回收示例

public class WeakReferenceDemo {
    public static void main(String[] args) {
        WeakReference<Object> weakRef =
                new WeakReference<>(new Object());

        System.gc(); // 建议 GC

        System.out.println(weakRef.get()); // 很可能输出 null
    }
}

注意:System.gc() 只是“建议”,不保证立即执行。


三、配合 ReferenceQueue 使用(进阶)

当弱引用对象被回收时,可以把引用本身放入队列,用于清理资源。

import java.lang.ref.*;

public class WeakRefQueueDemo {
    public static void main(String[] args) throws InterruptedException {
        ReferenceQueue<Object> queue = new ReferenceQueue<>();
        Object obj = new Object();
        WeakReference<Object> weakRef = new WeakReference<>(obj, queue);

        obj = null;
        System.gc();

        Thread.sleep(100);

        Reference<?> ref = queue.poll();
        if (ref != null) {
            System.out.println("对象已被回收,弱引用进入队列");
        }
    }
}

四、典型使用场景

✅ 1. 缓存(防止内存泄漏)

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

当 Value 对象只被缓存引用时,GC 可自动回收。

更推荐直接用:

WeakHashMap<K, V>

✅ 2. 监听器 / 回调防止内存泄漏

WeakReference<Listener> listenerRef = new WeakReference<>(listener);

避免 Listener 长期持有 Activity / Context。


✅ 3. ThreadLocal 的底层机制

ThreadLocalMap 的 key 就是 WeakReference<ThreadLocal<?>>,防止线程不结束时内存泄漏。


五、WeakHashMap 示例

import java.util.WeakHashMap;

public class WeakHashMapDemo {
    public static void main(String[] args) {
        WeakHashMap<Object, String> map = new WeakHashMap<>();
        Object key = new Object();
        map.put(key, "value");

        key = null;
        System.gc();

        System.out.println(map.size()); // 可能为 0
    }
}

六、注意事项 ⚠️

  • 弱引用 不等于自动管理生命周期
  • get() 可能返回 null
  • 不适合“必须存在”的数据
  • 常用于 缓存 / 监听 / 元数据

如果你愿意,我可以:

  • 解释引用关系
  • 对比 Weak vs Soft vs Phantom
  • 结合 Android / Spring / JVM 实际案例讲

你更想深入哪一部分?

向AI问一下细节

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

AI