3.0.2 Java 的引用

发布时间:2026/10/30 1:50:53

3.0.2 Java 的引用 Java 的引用在 JVM 中引用reference是一种数据类型用于定位某个对象或者 null。垃圾收集器正是沿着这种引用关系来推导对象是否存活、是否应当被回收。在传统认知里对象的状态是非黑即白的——要么从 GC Roots 出发沿强引用链可达存活要么不可达被判定为垃圾并回收。大部分场景下这个设计没有问题但存在一些特殊需求弹性缓存设计某些计算成本高昂但不致命的缓存数据希望在内存充足时保留以提升性能在内存吃紧时自动回收从而避免 OOM。生命周期解耦在事件监听器或回调机制中如果注册中心持有目标对象的强引用会导致目标对象在业务生命周期结束后依然无法被回收从而引发内存泄漏。特殊资源的清理某些 GC 无法直接管理的资源如堆外内存需要在对应的 Java 对象被销毁时触发安全的清理逻辑。为了赋予开发者更灵活的内存控制能力Java 从 JDK 1.2 开始引入了软引用SoftReference、弱引用WeakReference和虚引用PhantomReference。它们允许开发者在一定程度上介入对象的生命周期管理。虽然本文主要就是在介绍这三种引用除非你完全清楚其背后的运行逻辑并且拥有十分明确的不可避免的使用理由否则不要使用这些引用类及其浅层封装强引用强引用就是最传统的引用关系即代码中随处可见的Object o new Object()这种引用赋值。从 GC Roots 出发沿强引用链可达就会视为存活对象不会被垃圾收集器回收。软引用SoftReference仅软引用可达的对象在内存充足时不会被垃圾收集器回收在发生内存压力时GC 会根据策略回收它们。JVM 保证在抛出堆空间不足的 OOM 之前会清空所有指向“仅软引用可达”对象的软引用换而言之只有在清除软引用仍无法腾出足够内存时才会抛出 OOM 异常软引用试图把缓存驱逐策略内嵌进引用模型从设计动机上看有一定合理性但在实践中基本是失败的JVM 并没有足够的上下文来判断哪个对象“更值得保留”。应用没有应用不要使用软引用问题历史上软引用曾被用作缓存哪怕是现在 SoftReference 的 java doc 中也推荐其应用场景为缓存但其存在严重的缓存雪崩问题。软引用被回收的时机不可预测高并发下大量 key 同时失效重建开销集中爆发而程序员对此几乎毫无控制能力。有缓存需求请使用 Caffeine 等缓存组件此外软引用需要额外处理会对 GC 带来额外处理开销有可能造成更长的停顿时间弱引用WeakReference仅弱引用可达的对象会被垃圾收集器直接回收与软引用不同弱引用不试图干涉 GC 的回收决策。弱引用的本质是解耦对象的所有权与生命周期是一个合理的语义补充应用监听器/回调防内存泄漏这是最典型的用法。如果用强引用持有监听器注册方忘记反注册就会造成泄漏。用弱引用持有监听器宿主对象生命周期结束后自然被回收框架侧不需要依赖调用方的纪律性附加元数据WeakHashMap的核心场景key 是某个外部对象想附加一些元数据但不想因为这个 Map 的存在就延长 key 对象的生命周期。规范化映射用于确保内存中逻辑相等的对象只有一份物理实例。如果用强引用做享元池池子会不断膨胀导致内存泄漏利用弱引用持有池中的规范实例可以在外部业务不再使用该实例时允许 GC 将其自动回收问题弱引用的逻辑本身没有问题但所有弱引用操作本质上都是业务线程与 GC 线程之间的竞态使用时需要格外注意尤其注意WeakHashMap的使用它存在很多隐含且难以调试的竞态问题虚引用PhantomReference一个对象是否有虚引用存在完全不会对其生命周期构成影响甚至无法通过虚引用取得对象实例。为对象设置虚引用关联的唯一目的是在该对象被回收时收到一个通知虚引用本质上是 Java 缺乏可靠析构函数的补偿机制。这个工作本来应该由finalize()完成但finalize存在一系列严重缺陷对象复活、GC 需要单独处理一轮导致的性能问题、只执行一次、执行线程不可控、执行时机不确定、Finalizer 队列积压等。虚引用通过一个关键设计规避了其中最棘手的问题它不暴露原对象的引用业务清理逻辑无法访问原对象对象复活的路被彻底断掉了。此外它的执行线程也是可控的由开发者手动处理ReferenceQueue来驱动java.lang.ref.Cleaner就是虚引用的浅层封装会自己管理一个守护线程应用在业务代码中没有应用不要在业务代码中使用虚引用问题持有外部资源的对象在销毁时释放资源这个需求确实存在。但由于可达性分析的固有局限析构的执行时机永远无法保证实时性。资源应当使用try-with-resources手动关闭而不是依赖 GC 清理甚至不应该用虚引用来兜底它本质上是在掩盖问题而不是解决问题尽管 JDK 和很多开源框架/库中大量使用 Cleaner 进行兜底但是这是建立在面对的是不可信的调用方的基础上的。如果你写的不是 JDK 或框架/库不要使用虚引用DirectByteBuffer 除外它设计有问题导致只能用 Cleaner 关闭
延伸阅读

更多相关文章

2026/10/30 1:50:53

Komi Store:把 GitHub 应用装机的 5 步流程压成 1 个按钮

Komi Store:把 GitHub 应用装机的 5 步流程压成 1 个按钮 【免费下载链接】komi-store 🩵 A free, open-source app store for developers releases on GitHub, Codeberg & Forgejo — browse, discover, and install apps with one click. Formerly…

2026/10/30 1:50:53

霞鹜文楷安装:三平台十分钟装好免费商用中文字体

霞鹜文楷安装:三平台十分钟装好免费商用中文字体 【免费下载链接】LxgwWenKai An open-source Chinese font derived from Fontworks Klee One. 一款开源中文字体,基于 FONTWORKS 出品字体 Klee One 衍生。 项目地址: https://gitcode.com/GitHub_Tre…

2026/10/30 1:50:53

IPC_LOG + DYN_DEBUG + PRINTK

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

2026/10/30 3:05:59

AI如何10分钟搞定学术PPT?PaperXie实战解析

1. 项目概述:学术PPT制作的痛点与AI解决方案作为一名经历过数十次学术答辩的老手,我深知制作高质量PPT的痛苦。凌晨三点对着空白幻灯片发呆、反复调整格式却总是不满意、临答辩前还在手忙脚乱修改图表...这些场景每个科研人都再熟悉不过。直到我发现了Pa…

2026/10/30 3:05:59

2026年AI创业公司生态与技术路线解析

1. 2026年AI创业公司生态全景2026年的大模型应用领域已经形成了清晰的产业分层。从底层基础设施到垂直场景应用,整个产业链呈现出金字塔结构。最底层是提供算力支持的硬件厂商和云服务商,中间层是大模型基础架构提供商,最上层则是聚焦具体行业…

2026/10/30 3:05:59

深度学习核心原理与实践指南:从神经网络到CNN/RNN

1. 深度学习入门笔记概述深度学习作为机器学习的重要分支,近年来在各领域展现出惊人的应用潜力。这篇笔记将从基础概念入手,系统梳理深度学习的核心知识体系,帮助初学者建立完整的认知框架。不同于传统的机器学习方法,深度学习通过…

2026/10/30 3:05:59

华为昇腾CANN架构与AIGC算力优化实战

1. CANN架构与AIGC算力底座解析华为昇腾CANN(Compute Architecture for Neural Networks)作为专为AI场景设计的异构计算架构,其核心价值在于打通了从AI框架到昇腾芯片的完整技术栈。在AIGC爆发式增长的背景下,CANN通过三层关键设计…

2026/10/30 3:00:58

线性代数教材导读:矩阵、特征值与奇异值分解如何支撑AI

简介:《线性代数及其应用》第五版英文原版教材的PDF电子书,作者为马里兰大学David C. Lay,并由Steven R. Lay与Judi J. McDonald参与修订。本书面向高校理工科与经管类学生、考研复习者,以及人工智能和机器学习方向的自学读者&…

2026/10/29 17:05:52

全国计算机二级C语言真题PDF高效刷题指南

简介:这份PDF是全国计算机二级C语言考试的试题与答案解析,专为备考二级C语言的考生准备。内容涵盖C语言特点与设计理念、程序基本组成单位、main函数执行流程、函数嵌套调用规则、标识符命名规范、整型实型字符型数据类型、八进制十六进制数合法形式、运…

2026/10/29 17:06:02

requests+BeautifulSoup:爬虫抓取h1标题的入门实战指南

简介:一份以实战为导向的Python爬虫入门资源,面向具备基本编程基础、希望快速掌握网络数据抓取的初学者,可解决从零编写简单爬虫的常见困惑。实例以requests库发送HTTP请求、BeautifulSoup解析HTML文档,完整演示从网页中提取 标题…

2026/10/29 17:06:13

递推最小二乘参数辨识MATLAB编程:二阶系统与渐消记忆实现

简介:这是一篇面向控制系统、信号处理与机器学习等领域学习者的最小二乘参数辨识程序说明文档。资源共包含一个docx格式文档,压缩包大小七十八KB,内容围绕递推最小二乘算法和渐消记忆最小二乘算法展开:先构造一个极点位于单位圆内…

2026/10/30 0:00:46

NCP1342高频准谐振反激控制器:从设计约束到验收的完整方案

简介:NCP1342 高频准谐振反激控制器应用介绍译文文档,面向电源设计工程师、硬件研发人员及开关电源学习者,帮助读者跨越英文原版资料的语言门槛,系统理解这款高集成度 QR Flyback 控制器的设计要点。文档围绕芯片核心特性展开&…

2026/10/30 0:00:46

NCP1342准谐振反激电源设计:从选型到验收的全流程解析

简介:这份文档面向电源设计工程师与开关电源学习者,系统梳理NCP1342高频准谐振反激控制器的应用要点,帮助读者快速理解这款高集成度离线电源变换器控制芯片的工作机制与设计方法。内容涵盖芯片核心特性、引脚功能定义、电气特性参数表、最大额…

2026/10/30 0:00:46

Web系统自动登出机制设计与实现全解析

1. 系统自动登出机制的设计初衷在各类Web应用和后台管理系统中,自动登出功能早已成为标配。这个看似简单的功能背后,实际上涉及用户安全、资源管理和体验优化的多重考量。作为从业十多年的老开发,我见过太多因为登出逻辑设计不当导致的安全事…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑