news 2025/12/25 0:25:29

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进行投诉反馈,一经查实,立即删除!
网站建设 2025/12/15 14:19:52

1小时搭建Java面试题库原型:快马平台实战

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 使用快马平台快速开发一个Java面试题库系统原型&#xff0c;要求&#xff1a;1. 支持题目分类&#xff08;基础、进阶、算法等&#xff09;2. 全文检索功能 3. 用户答题记录 4. 错题…

作者头像 李华
网站建设 2025/12/15 14:19:29

5分钟搭建你的私有时间同步服务原型

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个最小可行的时间同步服务原型&#xff0c;功能包括&#xff1a;1) 从预置列表选择国内NTP服务器&#xff1b;2) 简单的客户端时间同步功能&#xff1b;3) 基本的状态反馈界面…

作者头像 李华
网站建设 2025/12/17 4:04:53

Leaflet开发效率翻倍:中文文档+AI代码生成黄金组合

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 请对比实现以下Leaflet功能的两种方式&#xff1a;1.传统手动编码方式 2.使用AI辅助生成代码。功能包括&#xff1a;地图初始化、标记点集群、GeoJSON数据加载、自定义图标和弹出窗…

作者头像 李华
网站建设 2025/12/15 14:18:42

.NET+AI | MEAI | ChatOptions 详解(5)

一句话简介ChatOptions 是 Microsoft.Extensions.AI 中传递给 IChatClient 的统一配置容器&#xff0c;用于在单次请求中精准控制生成策略、工具调用和扩展特性。&#x1f3af; 核心价值✅ 统一配置接口&#xff1a;跨提供商的一致配置体验✅ 细粒度控制&#xff1a;从对话上下…

作者头像 李华
网站建设 2025/12/15 14:18:41

MyBatis参数绑定异常:新手避坑指南

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 制作一个面向新手的MyBatis教学项目&#xff1a;1. 最简单的User查询示例 2. 逐步演示5种常见参数绑定错误 3. 每种错误的直观表现和解决方案 4. 交互式练习环节 5. 常见问题FAQ。要…

作者头像 李华