当前位置: 首页 > article >正文

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.kler.cn/a/537276.html

相关文章:

  • UNI-MOL: A UNIVERSAL 3D MOLECULAR REPRESENTATION LEARNING FRAMEWORK
  • Python----Python高级(并发编程:协程Coroutines,事件循环,Task对象,协程间通信,协程同步,将协程分布到线程池/进程池中)
  • U9成品入库单有提示 组织+单号已经存在
  • 某团面试题①—kudu读写流程
  • MySQL - 字段内分组
  • 面向对象程序设计-实验2
  • 24、深入理解与使用 Netty:Java 高性能网络编程的利器
  • (2024|ICLR,LLM 幻觉,事实性,知识层次)DoLa:通过对比层解码可提高大型语言模型的事实性
  • 2025.2.6 数模AI智能体大更新,更专业的比赛辅导,同提示词效果优于gpt-o1/o3mini、deepseek-r1满血
  • 【鸿蒙开发】第二十四章 AI - Core Speech Kit(基础语音服务)
  • Maven概述与安装
  • SpringBoot动力节点杨利军
  • git使用指南(保姆贴)
  • apisix的real-ip插件使用说明
  • Sentinel——Spring Boot 应用接入 Sentinel 后内存开销增长计算方式
  • 脚本一键生成管理下游k8s集群的kubeconfig
  • Unity游戏(Assault空对地打击)开发(6) 鼠标光标的隐藏
  • Hadoop智能房屋推荐系统 爬虫1w+ 协同过滤余弦函数推荐 代码+视频教程+文档
  • 【排序算法】选择排序
  • 【python】简单的flask做页面。一组字母组成的所有单词。这里的输入是一组字母,而输出是所有可能得字母组成的单词列表
  • RNN、LSTM和ELMo
  • C语言:将四个八位无符号数据拼接成32位的float数据
  • 深度计算学习:理论框架与算法革命的交汇
  • AI学习专题(一)LLM技术路线
  • Docker 构建镜像并搭建私人镜像仓库教程
  • 【专题】2024-2025人工智能代理深度剖析:GenAI 前沿、LangChain 现状及演进影响与发展趋势报告汇总PDF洞察(附原数据表)