0

0

什么是Java中的强、软、弱、虚引用_四种引用类型的内存回收时机

P粉602998670

P粉602998670

发布时间:2026-03-13 12:12:01

|

618人浏览过

|

来源于php中文网

原创

强引用不被GC回收,即使内存溢出;软引用在OOM前才回收,适合内存敏感缓存;弱引用每次GC都可能回收,用于防哈希表泄漏;虚引用仅用于回收通知,无法取值。

什么是java中的强、软、弱、虚引用_四种引用类型的内存回收时机

强引用不会被GC回收,哪怕内存溢出也不行

只要对象还被 Object obj = new Object() 这种方式直接持有,JVM 就认定它「必须活着」。哪怕堆快爆了,GC 也绝不会动它——宁可抛 OutOfMemoryError,也不会回收强引用对象。

常见错误现象:缓存用 HashMap 存大量对象,key 是强引用,导致对象长期无法释放,最终 OOM。

  • 使用场景:日常绝大多数变量、字段、方法参数都属于强引用,无需额外操作
  • 性能影响:零成本,但也是内存泄漏最常见源头
  • 容易踩的坑:static 字段持强引用 + 长生命周期类(如 Servlet、Spring Bean),极易造成 ClassLoader 泄漏

软引用在内存不足时才回收,适合做内存敏感缓存

SoftReference 的回收时机由 JVM 自主决定,但有个隐含规则:只有在即将发生 OutOfMemoryError 前,GC 才会清理它。不是“内存一紧张就收”,而是“快撑不住了才动手”。

使用场景:图片缓存、JSON 解析结果缓存等——希望常驻内存,但又不能抢走关键资源。

立即学习Java免费学习笔记(深入)”;

  • 参数差异:SoftReference<t>(referent)</t> 构造简单,但注意它不支持引用队列自动清理逻辑(得自己轮询 queue.poll()
  • 兼容性影响:Java 1.2+ 全支持,无风险;但 Android 上部分低版本 GC 策略更激进,软引用可能比预期早回收
  • 容易踩的坑:把 SoftReference 当成“弱一点的强引用”来用,结果发现缓存命中率极低——它本就不保证驻留时间

弱引用只要发生 GC 就可能消失,适合解决哈希表键泄漏

WeakReference 的回收门槛最低:下一次 GC(哪怕是 Young GC)就可能被清掉。它和 WeakHashMap 底层共用同一套机制——key 是弱引用,value 没有被其他强引用持有时,整条 Entry 就会被移除。

PathFinder
PathFinder

AI驱动的销售漏斗分析工具

下载

常见错误现象:WeakHashMap 里 key 对象被回收后,对应 value 却还在内存中——其实是 value 被其他地方强引用了,不是 WeakHashMap 失效。

  • 使用场景:监听器注册、ThreadLocal 的 key、临时映射关系(如 class → proxy 实例)
  • 性能影响:每次访问需判空(ref.get() != null),否则 NPE;但无额外 GC 开销
  • 容易踩的坑:误以为 WeakReference 能自动清理 value——它只管 referent,value 得自己处理生命周期

虚引用唯一作用是接收对象被回收的通知,不能取值

PhantomReference 是最特殊的:它的 get() 方法永远返回 null,你拿不到对象本身。它存在的唯一意义,是当对象进入 F-Queue 后,JVM 会把它加入关联的 ReferenceQueue,让你能感知“这东西刚被回收”。

使用场景:替代 finalize() 做资源清理(比如关闭堆外内存、释放文件句柄),因为 finalize() 已被弃用且不可靠。

  • 参数差异:构造必须传 ReferenceQueue,否则毫无意义;且必须配合队列轮询使用
  • 容易踩的坑:直接调 phantomRef.get() 想取对象——结果永远是 null;或忘记在队列中 poll 后调 clear(),导致 Reference 对象自身堆积
  • 注意点:虚引用对象在被回收前,必须已结束 finalize(如果有的话),所以它比弱/软引用更晚触发

四种引用真正难的不是定义,而是判断「这个业务该用哪一种」——比如缓存,选软引用还是弱引用,取决于你更怕 OOM 还是更怕频繁重建;而虚引用一旦用错,就等于没写清理逻辑。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

161

2025.08.06

Java Spring Security 与认证授权
Java Spring Security 与认证授权

本专题系统讲解 Java Spring Security 框架在认证与授权中的应用,涵盖用户身份验证、权限控制、JWT与OAuth2实现、跨站请求伪造(CSRF)防护、会话管理与安全漏洞防范。通过实际项目案例,帮助学习者掌握如何 使用 Spring Security 实现高安全性认证与授权机制,提升 Web 应用的安全性与用户数据保护。

89

2026.01.26

json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

457

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

549

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

337

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

82

2025.09.10

servlet生命周期
servlet生命周期

Servlet生命周期是指Servlet从创建到销毁的整个过程。本专题为大家提供servlet生命周期的各类文章,大家可以免费体验。

393

2023.08.08

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

254

2023.09.22

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

26

2026.03.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 4.4万人学习

C# 教程
C# 教程

共94课时 | 11.3万人学习

Java 教程
Java 教程

共578课时 | 81.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号