news 2026/8/7 19:08:47

java 中四种引用类型介绍

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
java 中四种引用类型介绍

在java中,对象的引用强度被分为四种,从强到弱一次是:强引用 → 软引用 → 弱引用 → 虚引用

它们都位于 java.lang.ref 包中,主要用于内存管理、缓存设计、避免 OOM 等场景

一、强引用(Strong Reference)

1、定义:最常见、默认的引用方式,只要强引用还存在,GC永远不会回收该对象。
Object obj = new Object(); obj 就是一个强引用。

2、GC 行为:不会回收,即使内存不足,也不会回收。内存不足时直接抛
OutOfMemoryError
3、示例
Object obj = new Object();
obj = null; // 断开强引用
只有当obj = null后,对象才有资格被GC回收。

4、使用场景:业务核心对象,普通成员变量、局部变量,生命周期明确,不能被回收的对象。

二、软引用(Soft Reference)

1、定义:内存不足时才会被GC 回收,适合做缓存

SoftReference softRef = new SoftReference<>(new Object());

2、GC 行为: 内存充足->不回收。内存不足->优先回收软引用对象,比OOM更早回收。
3、示例
SoftReference<byte[]> ref = new SoftReference<>(new byte[10 * 1024 * 1024]);

byte[] data = ref.get(); // 可能为 null
使用前必须判空

4、使用场景:缓存系统(图片缓存、本地数据缓存)类似 LRU + JVM GC 的缓存策略

三、弱引用(Weak Reference)

1、定义:只要发生GC,就会被回收,不管内存是否充足
WeakReference weakRef = new WeakReference<>(new Object());
2、GC行为:只要发生GC->立刻回收,回收率非常高。

3、示例:
WeakReference weakRef = new WeakReference<>(new Object());
System.gc();
Object obj = weakRef.get(); // 大概率为 null
4、使用场景:
① WeakHashMap
Map<Object, String> map = new WeakHashMap<>();
key 是弱引用
key 没有强引用时,Entry 自动删除
② 防止内存泄漏
ThreadLocal
监听器(Listener)
回调对象 📌 ThreadLocal 内部就是弱引用 key

四、虚引用(Phantom Reference)

1、定义
最弱的一种引用
get() 永远返回 null
必须和 ReferenceQueue 配合使用

PhantomReference phantomRef =
new PhantomReference<>(new Object(), referenceQueue);
2、GC行为
对象被回收前 → 放入 ReferenceQueue
无法通过虚引用获取对象
3、示例:
ReferenceQueue queue = new ReferenceQueue<>();

PhantomReference ref =
new PhantomReference<>(new Object(), queue);

// 监控对象被回收
Reference<?> r = queue.poll();

4、使用场景
对象回收前通知
资源释放(直接内存、堆外内存)
NIO / Netty
Cleaner、Unsafe 底层机制

五、四种引用对比总结

引用类型GC 时是否回收get()典型用途
强引用❌ 永不回收有值普通对象
软引用内存不足才回收可能为 null缓存
弱引用GC 就回收大概率 null防泄漏
虚引用回收前通知永远 null资源释放
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/7 15:45:10

AI如何优化锁相环电路设计?

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个基于AI的锁相环设计辅助工具&#xff0c;能够根据用户输入的频率范围、相位噪声要求等参数&#xff0c;自动生成优化的锁相环电路设计方案。工具应包含以下功能&#xff1a…

作者头像 李华
网站建设 2026/8/7 22:03:45

OpenMP入门:零基础写出第一个并行程序

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 请创建一个最简单的OpenMP入门示例程序&#xff0c;功能要求&#xff1a;1) 打印"Hello World" 2) 使用OpenMP并行输出线程ID 3) 包含基本的编译指令说明 4) 解释每个Ope…

作者头像 李华
网站建设 2026/8/6 23:57:13

AI如何帮你快速掌握Modbus TCP协议开发

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个Python脚本&#xff0c;使用Modbus TCP协议与工业设备通信。要求实现以下功能&#xff1a;1. 建立TCP连接&#xff1b;2. 读取保持寄存器数据&#xff1b;3. 写入单个寄存器…

作者头像 李华
网站建设 2026/8/7 16:06:46

3分钟搞定Java环境:Cursor vs 传统方式效率对比

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个Java环境配置效率对比工具&#xff0c;能够记录并比较手动配置和使用自动化工具配置Java环境的时间消耗和成功率。工具应包含&#xff1a;1) 手动配置流程记录模块 2) 自动…

作者头像 李华
网站建设 2026/8/7 0:01:54

3步快速验证你的Adobe弹窗解决方案

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 快速开发一个最小可行产品(MVP)来验证处理Adobe Genuine Service Alert弹窗的核心逻辑。要求&#xff1a;1. 仅实现最基本的弹窗检测功能&#xff1b;2. 简单的修复机制&#xff1b…

作者头像 李华
网站建设 2026/8/7 10:52:55

深度学习模型加载实战:解决权重加载失败的5种方法

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 编写一个完整的深度学习模型加载示例&#xff0c;包含以下功能&#xff1a;1)尝试加载pickle格式的模型权重 2)捕获_pickle.unpicklingerror异常 3)提供三种恢复方案&#xff1a;a)…

作者头像 李华