首页/新闻资讯/正文详情

Java中的引用类型分为四种:强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)和虚引用(Phantom Reference)

发布时间:2026/11/3 9:53:58 来源:云帆数科 栏目:资讯中心
Java中的引用类型分为四种:强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)和虚引用(Phantom Reference)
Object obj new Object()这行代码太熟了熟到大多数人从没想过obj只是引用变量而“引用”本身是分等级的。除了这种默认、最强硬的一种JDK 还提供了软引用、弱引用、虚引用。它们改变的其实只是一件事——对象什么时候可以被回收。这四种引用的回收门槛依次降低。用得对是缓存和防内存泄漏的顺手工具用错了就是一堆“明明没引用它却还活着 / 明明在用却突然没了”的诡异 bug。下面从强到弱过一遍重点讲清楚弱引用以及它和软引用到底怎么选、怎么用。一、四种引用从强到弱1. 强引用Strong Reference就是我们平时写的newObject obj new Object();只要这条强引用还在GC 就绝不会回收它指向的对象。哪怕堆已经紧到马上要抛OutOfMemoryErrorJVM 也更愿意自己 OOM而不是动一个还有强引用的对象。这是默认、也是最强的一档。想让对象可回收办法只有主动断开引用obj null或者让它随作用域自然消失。日常写业务99% 的时间都只跟强引用打交道另外三种是解决特定问题的工具。2. 软引用Soft Reference用SoftReferenceT包一层SoftReferencebyte[] cache new SoftReference(new byte[1024 * 1024]); byte[] data cache.get(); // 可能已经为 null规则是内存够用时不动它内存紧张时 GC 会把它清掉——而且清理发生在抛出 OOM 之前相当于给堆留的最后一道缓冲。这里有个细节大多数人不知道软引用不是“内存一紧张就全清”。HotSpot 采用一种类似 LRU 的策略由-XX:SoftRefLRUPolicyMSPerMB控制——每剩余 1MB 堆软引用大约能“存活”1 秒默认值 1000。堆越空软引用越容易被保留堆越紧越容易被清。这也是它天生适合做缓存的原因。3. 弱引用Weak ReferenceWeakReferenceT本文的重点WeakReferenceObject ref new WeakReference(new Object()); Object o ref.get(); // 只要发生过一次 GC这里大概率是 null它比软引用还弱只要对象只被弱引用指着没有强引用链能到达它那么下一次 GC 就会回收它跟内存够不够完全无关。换句话说弱引用根本挡不住 GC。有个容易踩的误区值得点破弱引用并不改变对象“是否可达”的判定。如果对象还被别的强引用持有它照样活着弱引用不会让它提前被回收弱引用只是在没人强引用它之后不构成“活下去”的理由。典型用法是WeakHashMap、监听器的注册表以及“对象活着我才缓存、对象死了缓存自动失效”这类场景。4. 虚引用Phantom ReferencePhantomReferenceT最特殊的一个ReferenceQueueObject queue new ReferenceQueue(); PhantomReferenceObject phantom new PhantomReference(new Object(), queue);两个特征一是get()永远返回 null你没法通过它拿到对象二是它必须和ReferenceQueue配合使用。它唯一的意义在于当对象即将被回收时JVM 会把对应的虚引用塞进队列程序据此得知“某个对象没了”从而做清理。典型用途是管理堆外内存——DirectByteBuffer的Cleaner就是这么实现的。注意它是“回收之后的通知”而不是“阻止回收”。二、四种引用对照表引用类型回收时机get() 结果典型用途强引用只要引用链可达就不回收对象本身普通对象软引用内存不足时回收OOM 之前存在则返回否则 null内存敏感缓存弱引用下次 GC 即回收存在则返回否则 nullWeakHashMap、监听器虚引用对象被回收后进队列通知恒为 null堆外内存清理、回收跟踪把这张表记住选型基本就不会错要不要留住对象看它的“门槛”在哪一档。三、弱引用的典型使用场景1. WeakHashMap 做缓存。键是弱引用当键对象不再被其他地方强引用时这个键值对会被自动移除从而避免缓存把键“焊死”在内存里WeakHashMapKey, Value cache new WeakHashMap(); Key key new Key(); cache.put(key, new Value()); key null; // 唯一强引用消失下次 GC 后该条目会被清掉不过这里有个反直觉的坑WeakHashMap 只弱化“键”值仍然是强引用。如果值反过来强引用了键比如 value 内部持有 key 的引用就构成了“键 → 值 → 键”的强引用闭环键永远回收不掉条目也就一直清不掉。它被误当成通用缓存、最后翻车多半栽在这儿。2. 监听器 / 回调注册表。组件注册监听器时如果容器用强引用持有监听器而监听器又持有宿主宿主就永远释放不掉。用弱引用持有监听器对象销毁后条目自动失效省掉手动反注册class Listener { private final WeakReferenceTarget targetRef; public Listener(Target target) { this.targetRef new WeakReference(target); } }3. 打破双向关联里的“反拖”。父子双向关联是内存泄漏重灾区父持有子、子又持有父。把其中反向的那一侧子 → 父改成弱引用就能避免相互拖累。class Parent { private final ListChild children new ArrayList(); } class Child { private WeakReferenceParent parent; // 反向引用用弱引用 }这里要澄清一个常见误解Java 的 GC 靠可达性分析本来就能回收“循环引用”所以弱引用在这里解决的不是“GC 收不掉循环”而是——当外部只引用子对象时子对象不该反过来把父对象一直拽着、导致父对象无法释放。四、弱引用还是软引用怎么选两者最容易混。一句话区分软引用赌的是“内存还够”弱引用赌的是“还有人用”。想拿它做缓存、又愿意在内存紧张时让出用软引用。它给了内存压力一个缓冲堆空时保留得住。想让它“随对象的生命周期自动失效”、不参与保命用弱引用。比如缓存本身不该成为对象存活的原因。但软引用也有坑它可能被 JVM 在某个不稳定时刻集中清理导致缓存命中率抖动而弱引用在每次 GC 都可能丢掉过于激进。真正要做高性能缓存Caffeine、Guava Cache这类带淘汰策略的组件比裸用引用类型靠谱得多。五、总结回到开头这四种引用区分的不是“能不能访问对象”而是“对象什么时候可以被回收”门槛从强到弱依次是——只要可达就不收强、内存不足才收软、下次 GC 就收弱、回收后给你个通知虚。带走几条强引用是默认行为也是内存泄漏的常见源头之一别让长生命周期容器无意中强持短生命周期对象软引用适合内存敏感缓存但它“活得久不久”由堆的余量决定别指望它精确保留弱引用不挡 GC只解决“别让它成为保命理由”WeakHashMap、监听器、双向关联的反向引用是它的主场虚引用get()恒为 null离开ReferenceQueue就没有意义它的舞台是堆外内存这类“必须知道对象何时消失”的清理工作。最后一句实话WeakReference、SoftReference这些工具很锋利但绝大多数业务代码压根用不上它们。真正会用是在你明确知道“谁该决定这个对象的生死”的时候——而不是为了显得懂 JVM 而在代码里塞几个引用类。

相关推荐

【系统架构设计师-Redis(2)】Redis 五大核心数据结构与典型场景实战(含秒杀、限流、队列、排行榜)
【系统架构设计师-Redis(2)】Redis 五大核心数据结构与典型场景实战(含秒杀、限流、队列、排行榜)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 9:53:58

TabPFN-3终极指南:如何在5分钟内掌握这个革命性表格预测模型
TabPFN-3终极指南:如何在5分钟内掌握这个革命性表格预测模型

TabPFN-3终极指南:如何在5分钟内掌握这个革命性表格预测模型 你想知道如何快速上手最先进的表格预测模型吗?TabPFN-3作为一款基于Transformer架构的表格预测基础模型,通过上下文学习技术,能够在单次前向传播中解决复杂的表格预测… · 2026/11/3 9:53:58

LTX-Best-Face-ID vs 传统视频生成工具:为什么它是人脸保留的最佳选择
LTX-Best-Face-ID vs 传统视频生成工具:为什么它是人脸保留的最佳选择

LTX-Best-Face-ID vs 传统视频生成工具:为什么它是人脸保留的最佳选择 LTX-Best-Face-ID是一款基于LTX-2.3(22B)模型的身份保留参考转视频LoRA工具,它能根据人物参考照片和文本提示生成保持人物身份的视频。与传统视频生成工具相… · 2026/11/3 9:53:58

国产AI写歌三巨头正面刚:开源YuE2、抖音、MiniMax到底谁更值得玩?
国产AI写歌三巨头正面刚:开源YuE2、抖音、MiniMax到底谁更值得玩?

国产AI写歌三巨头正面刚:开源YuE2、抖音、MiniMax到底谁更值得玩? 你有没有过这种时刻:半夜灵感爆棚,脑子里盘旋着一段旋律,却既不会作曲也不会编曲,只能干着急?以前想给自己写首歌,… · 2026/11/3 10:31:56

新手Speed Dail 快捷按钮交互动效设计简易版教程
新手Speed Dail 快捷按钮交互动效设计简易版教程

新手Speed Dail 快捷按钮设计简易版教程 1.先用A键画出画框 2.将提前准备好的图标编组框起来自动布局3.用R键画出矩形用作底部填充4.用O键画出圆形再复制一个 将一个圆形填充颜色并在内部用矩形做成加号5.将刚刚复制出来的圆形和标签栏的矩形选一起减去顶层(altshif… · 2026/11/3 10:31:56

它到底会“画”还是会“动”?万相 Animate 2 拆解:一致性、时长、风格这三道坎
它到底会“画”还是会“动”?万相 Animate 2 拆解:一致性、时长、风格这三道坎

它到底会“画”还是会“动”?万相 Animate 2 拆解:一致性、时长、风格这三道坎 最近 AI 视频圈有个很有意思的现象:大家不再比谁生成的画面更漂亮,而是开始比谁能让同一个人,稳稳当当地动起来。 阿里通义万相开源的 Wa… · 2026/11/3 10:31:56

我如何给 Agent 写记忆:文件、索引与失效治理
我如何给 Agent 写记忆:文件、索引与失效治理

我如何给 Agent 写记忆:文件、索引与失效治理 前言 我印象最深的一条 Agent 记忆,跟技术一点关系没有。有次让 Agent 打开一个 pptx,它用 Keynote 打的,弹了一串确认窗,把正在干别的的用户烦着了,甩来一句… · 2026/11/3 10:31:56

【培训类-01-02】20261025Workbuddy制作师德演讲Word+PPT
【培训类-01-02】20261025Workbuddy制作师德演讲Word+PPT

一、背景需求我报名院内师德演讲。10月30日要脱稿。所以要制作讲稿和PPT我想用最近学的workbuddy来制作二、制作过程新建文件夹最后资料都在这个文件夹里并提出我的设想它的回答写的不错感觉只有正文内容有点少,所以我把三、教师建议也做进去了用了5分钟才写完这下又… · 2026/11/3 10:31:56

Chloe:基于多级向量化与控制路径缩减的全同态加密上的循环变换
Chloe:基于多级向量化与控制路径缩减的全同态加密上的循环变换

一、核心问题论文的核心问题是:现有 FHE 编译器对“非平凡循环结构”的支持不足,导致 FHE 上程序表达能力和执行效率受限。具体来说:FHE 允许在密文上计算,但密文计算与明文计算行为差异很大。逻辑电路、比较、分支等非算术操作在… · 2026/11/3 10:30:56

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 6:04:24

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 5:52:46

STM32F411RE与MAX14431实现SPI隔离:工业现场抗共模干扰实战
STM32F411RE与MAX14431实现SPI隔离:工业现场抗共模干扰实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59

ESP32+大模型AI硬件开发:从Demo到产品的8个工程问题
ESP32+大模型AI硬件开发:从Demo到产品的8个工程问题

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59

基于MAX14431BAEE+与PIC18F85J10的SPI隔离方案设计与实践
基于MAX14431BAEE+与PIC18F85J10的SPI隔离方案设计与实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 6:04:24

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 5:52:46

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码