温馨提示×

温馨提示×

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

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

java软引用如何使用

发布时间:2026-10-08 18:55:37 来源:亿速云 阅读:87 作者:小樊 栏目:编程语言

在 Java 中,软引用(SoftReference) 是 java.lang.ref.SoftReference 提供的引用类型,主要用于内存敏感的高速缓存场景。


一、什么是软引用

软引用:当内存充足时,GC 不会回收软引用对象;当内存不足时,GC 会回收软引用对象。

它是介于 强引用 和 弱引用 之间的引用级别。

引用强度排序:

强引用 > 软引用 > 弱引用 > 虚引用

二、基本使用示例

1️⃣ 创建软引用

import java.lang.ref.SoftReference;

public class SoftReferenceDemo {
    public static void main(String[] args) {
        // 强引用对象
        byte[] data = new byte[1024 * 1024 * 10]; // 10MB

        // 创建软引用
        SoftReference<byte[]> softRef = new SoftReference<>(data);

        // 解除强引用
        data = null;

        // 通过软引用获取对象
        byte[] result = softRef.get();
        if (result != null) {
            System.out.println("对象还存在");
        } else {
            System.out.println("对象已被回收");
        }
    }
}

三、典型使用场景:内存缓存

✅ 图片 / 数据缓存

import java.lang.ref.SoftReference;
import java.util.HashMap;

public class CacheDemo {
    private static HashMap<String, SoftReference<Object>> cache = new HashMap<>();

    public static void put(String key, Object value) {
        cache.put(key, new SoftReference<>(value));
    }

    public static Object get(String key) {
        SoftReference<Object> ref = cache.get(key);
        return ref == null ? null : ref.get();
    }
}

当 JVM 内存紧张时,缓存对象会被自动回收,避免 OOM。


四、配合 ReferenceQueue 使用(可选)

如果你想在对象被回收时做清理:

import java.lang.ref.ReferenceQueue;
import java.lang.ref.SoftReference;

public class SoftWithQueue {
    public static void main(String[] args) {
        ReferenceQueue<byte[]> queue = new ReferenceQueue<>();

        SoftReference<byte[]> ref =
                new SoftReference<>(new byte[1024 * 1024 * 5], queue);

        // GC 后可以通过 queue.poll() 清理缓存
    }
}

五、软引用 vs 弱引用

引用类型 是否会被 GC 使用场景
强引用 不会 普通对象
软引用 内存不足时 缓存
弱引用 下次 GC 防止内存泄漏

六、注意事项

  1. 不能保证一定不回收
  2. 不推荐用于“必须存在”的数据
  3. 多用于 可选缓存
  4. Android 中更推荐 LruCache

七、简单总结

✅ 软引用适合:

  • 内存缓存
  • 大对象临时存储
  • 提升命中率 + 防止 OOM

❌ 不适合:

  • 核心业务数据
  • 必须持久存在的数据

如果你愿意,我也可以给你讲 Android 中的软引用实践 或 SoftReference + LRU 的实现。

向AI问一下细节

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

AI
助
手