Java 垃圾回收 中 软引用适合什么场景

老强酱_8276

老强酱_8276

2026-11-14

950人浏览

原创

软引用(softreference)适合处理内存敏感的高速缓存,其核心策略是在系统抛出 outofmemoryerror 之前回收这些对象。具体做法是将缓存数据包装在 softreference 中并指向 referencequeue,当 jvm 堆空间不足时,垃圾回收器会自动清理这些弱可达对象以释放内存,从而避免程序崩溃。

Java 垃圾回收 中 软引用适合什么场景

软引用与强引用的内存行为差异是什么

强引用在任何情况下都不会被回收,而软引用仅在内存不足时被回收。通过对比两者在不同堆容量下的存活状态,可以直观看到软引用的“惰性”回收特性。

Java 垃圾回收 中 软引用适合什么场景

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

public class SoftRefDemo {
    public static void main(String[] args) {
        // 1. 创建大对象并建立软引用
        byte[] largeData = new byte[10 * 1024 * 1024]; // 10MB
        ReferenceQueue<byte> queue = new ReferenceQueue();
        SoftReference<byte> softRef = new SoftReference(largeData, queue);

        // 2. 断开强引用,使对象变为软可触及
        largeData = null;

        // 3. 模拟内存压力(此处仅演示逻辑,实际需触发GC)
        System.out.println("Strong ref is null: " + (largeData == null));
        System.out.println("Soft ref get(): " + (softRef.get() != null));
        
        // 注意:实际运行中需通过 -Xmx 限制内存并调用 System.gc() 来观察回收行为
    }
}</byte></byte>

在上述代码中,largeData 被置为 null 后,对象失去了强引用支撑。此时若执行 softRef.get(),只要 JVM 认为内存充足,返回的依然是原始对象;只有当内存紧张触发 GC 时,该对象才会被回收,且 softRef 会被加入 queue 中。

如何结合 ReferenceQueue 实现自动清理

单独使用软引用无法知道对象何时被回收,必须配合 ReferenceQueue 才能构建完整的缓存清理机制。通过将队列传入构造函数,可以在 GC 发生后获取失效的引用实例。

modern-javascript-patterns
modern-javascript-patterns

掌握 ES6+ 特性,包括 async/await、解构、扩展运算符、箭头函数、Promise、模块、迭代器、生成器以及函数式编程模式,编写简洁高效的 Java

下载

Java 垃圾回收 中 软引用适合什么场景

import java.lang.ref.Reference;
import java.lang.ref.SoftReference;
import java.lang.ref.ReferenceQueue;
import java.util.HashMap;
import java.util.Map;

public class CacheWithSoftRef {
    private final Map<string softreference>> cache = new HashMap();
    private final ReferenceQueue<byte> queue = new ReferenceQueue();

    public void put(String key, byte[] value) {
        // 清理已回收的引用
        purgeQueue();
        cache.put(key, new SoftReference(value, queue));
    }

    public byte[] get(String key) {
        SoftReference<byte> ref = cache.get(key);
        if (ref != null) {
            byte[] value = ref.get();
            if (value != null) {
                return value; // 内存充足,直接返回
            } else {
                // 对象已被回收,从缓存移除
                cache.remove(key);
            }
        }
        return null; // 缓存未命中或已失效
    }

    private void purgeQueue() {
        Reference extends byte[]> ref;
        while ((ref = queue.poll()) != null) {
            // 实际场景中需维护一个反向映射或从主缓存中移除对应的 Key
            // 这里简化处理,假设我们在 get 时进行惰性清理
        }
    }
}</byte></byte></string>

在 get 方法中,我们首先检查 ref.get() 是否为空。如果为空,说明软引用指向的对象已经被 GC 回收,此时直接从 cache 中移除该键值对,确保后续查询不会再次访问无效引用。这种模式常用于实现 LRU 缓存的替代方案,即“最近最少使用”由内存压力决定而非固定步长。

基于特定输入条件软引用何时会被立即回收

软引用的回收时机取决于 JVM 的内存分配策略和当前堆的使用率。当新对象的分配导致堆空间超过阈值,且没有其他强引用保护时,软引用对象会成为首要回收目标。

在 CacheWithSoftRef 程序中,如果连续调用 put 存入大量远超堆剩余空间的数据,JVM 会在分配新内存前尝试回收软引用。此时,即使之前存入的 byte[] 尚未被 get 访问,也会因为内存不足而被立即回收。这种行为验证了软引用“内存敏感”的特性:它不保证对象一定存活,只保证在内存充裕时尽可能保留。

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

java

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

12577

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

9662

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

8212

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

1324

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

1048

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1576

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

3289

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

20531

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

1435

8

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习