JVM 中的四类引用:强、软、弱、虚

news/2025/2/8 14:37:42 标签: jvm

导言
在 Java 开发中,垃圾收集(GC)机制通过自动管理内存提升了开发效率。但你是否知道 JVM 通过四种引用类型(强、软、弱、虚)精细控制对象生命周期?

强引用(Strong Reference)

特征:默认引用类型,只要强引用存在,对象绝不会被 GC 回收。

public class StrongReferenceDemo {
    public static void main(String[] args) {
        Object obj = new Object(); // 强引用
        System.out.println("GC前: " + obj);
        
        obj = null; // 切断强引用
        System.gc(); // 建议JVM执行GC
        
        System.out.println("GC后: " + obj);
    }
}

输出

GC前: java.lang.Object@15db9742
GC后: null

解析:将 obj 置为 null 后,原对象失去强引用,GC 会回收其内存。

软引用(SoftReference) 

特征:内存不足时,GC 会回收软引用对象。适合实现缓存。

public class SoftReferenceDemo {
    public static void main(String[] args) {
        SoftReference<byte[]> softRef = new SoftReference<>(new byte[10 * 1024 * 1024]); // 10MB
        
        System.out.println("GC前: " + softRef.get());
        System.gc();
        System.out.println("内存充足GC后: " + softRef.get());
        
        // 分配更多内存,触发内存不足
        byte[] newAllocation = new byte[15 * 1024 * 1024]; 
        System.out.println("内存不足时: " + softRef.get());
    }
}

运行参数-Xmx20M 限制堆内存为 20MB

输出

GC前: [B@6d06d69c
内存充足GC后: [B@6d06d69c 
内存不足时: null

弱引用(WeakReference)

特征:无论内存是否充足,GC 时立即回收。

public class WeakReferenceDemo {
    public static void main(String[] args) {
        WeakReference<Object> weakRef = new WeakReference<>(new Object());
        
        System.out.println("GC前: " + weakRef.get());
        System.gc();
        System.out.println("GC后: " + weakRef.get());
    }
}

输出

GC前: java.lang.Object@7852e922
GC后: null

虚引用(PhantomReference)

特征:无法通过虚引用访问对象,必须配合 ReferenceQueue 使用,用于追踪对象回收。

public class PhantomReferenceDemo {
    public static void main(String[] args) throws InterruptedException {
        ReferenceQueue<Object> queue = new ReferenceQueue<>();
        PhantomReference<Object> phantomRef = new PhantomReference<>(new Object(), queue);
        
        System.out.println("PhantomRef.get(): " + phantomRef.get()); // 始终为null
        
        System.gc();
        Thread.sleep(500);
        
        Reference<?> ref = queue.poll();
        if (ref != null) {
            System.out.println("对象已被回收,通过队列通知");
        }
    }
}

输出

PhantomRef.get(): null
对象已被回收,通过队列通知

应用场景:管理堆外内存(如 NIO 的 DirectBuffer),确保资源释放。

四类引用对比总结

引用类型回收时机常见用途
强引用永不回收(除非不可达)普通对象创建
软引用内存不足时内存敏感缓存
弱引用下次GC时缓存、WeakHashMap
虚引用对象回收后资源清理跟踪


http://www.niftyadmin.cn/n/5844976.html

相关文章

什么是可观测性?

现代服务架构常常谈及三个性&#xff1a; 弹性&#xff0c;韧性&#xff0c;可观测性。今天且按下其他两性不表&#xff0c;着重聊一聊可观测性。本文就几个主题对可观测性展开讨论&#xff1a; 可观测性是什么可观测性是必须的吗企业的可观测性落地 可观测性理念 可观测性是…

web直播弹幕抓取分析 signature

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 前言 最近遇到太多难点了卡了很久&am…

122,【6】buuctf web [护网杯2018] easy_tornado

进入靶场 出现了3个文件 点击看看 都点击看看 得知flag所在目录 render在 Web 开发框架中常常出现 cookie_secret 是一个用于对 Cookie 进行签名或加密的密钥。 意味着我们现在需要先找到 cookie_secret 在请求里有cookie&#xff0c;但都不显示cookie&#xff0c;反观三个…

神经网络|(八)概率论基础知识-二项分布及python仿真

【1】引言 前序已经学习了古典概型、条件概率、全概率公式和贝叶斯公式&#xff0c;它们作为基础&#xff0c;解释了事件发生及其概率的对应关系&#xff0c;相关文章链接为&#xff1a; 神经网络|(四)概率论基础知识-古典概型-CSDN博客 神经网络|(五)概率论基础知识-条件概…

在rtthread中,scons构建时,它是怎么知道是从rtconfig.h找宏定义,而不是从其他头文件找?

在rtthread源码中&#xff0c;每一个bsp芯片板级目录下都有一个 SConstruct scons构建脚本的入口&#xff0c; 在这里把rtthread tools/目录下的所有模块都添加到了系统路径中&#xff1a; 在tools下所有模块中&#xff0c;最重要的是building.py模块&#xff0c;在此脚本里面…

智慧交通:如何通过数据可视化提升城市交通效率

随着城市化进程的加速&#xff0c;交通管理面临着前所未有的挑战。为了应对日益复杂的交通状况&#xff0c;智慧交通系统应运而生&#xff0c;其中数据可视化技术成为了提升交通管理效率的关键一环。本文将探讨如何利用山海鲸可视化软件来优化交通管理&#xff0c;并展示其在智…

3.1 可视化算子编程语言

HuggingFists的VO编程语言与常见的其它编程语言有一定的区别。其语言由两种不同的语法特征构成。一部分以可视化算子作为语法基础(简称&#xff1a;VO-O)&#xff0c;辅助使用者可视化的完成数据处理/分析流程的编写&#xff1b;一部分采用表达式语法(简称&#xff1a;VO-E)&am…

python编程-类结构,lambda语法,原始字符串

一个类的基本结构包括以下部分&#xff1a; 类名&#xff1a;用来描述具有相同属性和方法的对象的集合。 属性&#xff1a;类变量或实例变量&#xff0c;用于处理类及其实例对象的相关数据。 方法&#xff1a;在类中定义的函数&#xff0c;用于执行特定操作。 构造器&#xff…