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

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资源释放
http://www.cnnetsun.cn/news/63654.html

相关文章:

  • AI如何优化锁相环电路设计?
  • OpenMP入门:零基础写出第一个并行程序
  • AI如何帮你快速掌握Modbus TCP协议开发
  • 3分钟搞定Java环境:Cursor vs 传统方式效率对比
  • 3步快速验证你的Adobe弹窗解决方案
  • 深度学习模型加载实战:解决权重加载失败的5种方法
  • 企业级时间同步方案:国内NTP服务器实战部署
  • AI帮你写Git提交信息:告别手动Commit描述
  • 同城自助KTV预约:JAVA线上系统超给力
  • 用Vue3 inject快速搭建可插拔插件系统
  • 零基础入门:10分钟学会EasyPlayer.js的基本使用
  • Yande引擎入口在企业内部文档搜索中的应用
  • Python多线程编程入门:ThreadPoolExecutor保姆级教程
  • 老旧产线不淘汰,数据孤岛轻松破:EtherNet/IP与DeviceNet协议转换实战
  • WSL更新失败?企业开发环境实战解决方案
  • AI如何优化Python线程池:ThreadPoolExecutor的智能调参
  • AI助力SSH端口配置:一键生成安全连接脚本
  • AI赋能:用VSCode插件智能解析小说内容
  • 1小时搭建模型预测控制原型:快马平台实战
  • 1小时搭建DHT11物联网监控原型
  • Gazebo仿真入门:零基础搭建第一个机器人世界
  • 零基础玩转DHT11:从接线到数据读取全指南
  • 传统网络配置 vs AI辅助:处理10.8.8.8的效率对比
  • 如何用AI自动修复代理连接错误?快马平台实战
  • 传统vsAI:全球项目交付速度提升300%的秘诀
  • 告别手动编写:AI一键生成完整docsify项目
  • 告别手动调色:AI颜色表工具效率对比测试
  • 零基础教程:3分钟实现el-input只能输入数字
  • Linux新手必学:tail -f命令详解
  • 如何用AI解决Windows错误代码0x00000771