news 2026/6/10 20:46:19

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/6/9 22:19:35

如何用AI快速解决ORA-01033错误?

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个Oracle数据库错误诊断工具&#xff0c;专门处理ORA-01033错误。工具应能&#xff1a;1. 自动分析错误日志&#xff1b;2. 提供可能的解决方案列表&#xff1b;3. 生成修复脚…

作者头像 李华
网站建设 2026/6/10 13:15:43

零基础入门:手机抓包工具使用全图解

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个面向新手的step-by-step教程&#xff1a;1. 手机和电脑的环境配置图解 2. Charles/Fiddler基础设置演示 3. 捕获第一个HTTP请求的完整流程 4. 查看请求头和响应体的基础操作…

作者头像 李华
网站建设 2026/6/10 14:15:27

1小时搞定:用Leaflet快速搭建房产地图原型

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 快速开发一个房产地图原型&#xff0c;功能包括&#xff1a;1.显示城市基础地图 2.从模拟JSON数据加载房源位置 3.不同房型使用不同图标标记 4.点击标记显示房源基本信息 5.实现简单…

作者头像 李华
网站建设 2026/6/9 10:29:10

1分钟快速验证API:requests.post原型开发技巧

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个快速API测试工具原型&#xff0c;功能包括&#xff1a;1. 可视化输入URL和参数 2. 一键发送POST请求 3. 格式化显示响应结果 4. 历史请求记录 5. 支持保存常用配置。要求使…

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

AI如何帮你自动生成Spring Bean管理代码

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 使用快马平台生成一个Spring Boot项目&#xff0c;自动配置Bean管理功能。包括&#xff1a;1. 自动扫描Component、Service、Repository等注解&#xff1b;2. 生成Bean的依赖注入示…

作者头像 李华
网站建设 2026/6/10 7:56:23

告别低效调试:手机抓包工具让开发效率提升300%

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个对比测试项目&#xff1a;1. 传统方式&#xff1a;通过logcat打印日志调试网络请求 2. 使用专业抓包工具调试相同场景。要求展示&#xff1a;a) 问题定位时间对比 b) 数据完…

作者头像 李华