讲师中心 微信公众号
AI工具推荐 视频效率加速

在Java中强引用软引用弱引用有什么区别_Java引用类型解析

雨墨吖_7956

雨墨吖_7956

发布时间:2026-01-29 11:07:06

|

285人浏览过

|

来源于php中文网

原创

强引用“砍不断”因其不参与GC决策,只要变量未置null或未出作用域,JVM宁抛OutOfMemoryError也不回收;软引用仅在OOM前可能被回收,适合缓存;弱引用GC时立即回收,适用于WeakHashMap;虚引用仅用于回收通知,需配合ReferenceQueue。

在java中强引用软引用弱引用有什么区别_java引用类型解析

强引用为什么“砍不断”?——它不参与GC决策

强引用就是你每天写的 Object obj = new Object(),只要变量 obj 还在栈帧里活着(没被设为 null、没出作用域),哪怕堆内存快爆了,JVM 也宁可抛 OutOfMemoryError,绝不会动它。这不是“不想收”,而是 GC 根可达算法直接把它标为“必须存活”。

常见错误现象:
- 把大对象(如 byte[])放进静态集合后忘了清理 → 内存泄漏
- 在监听器注册后没解绑,而监听器又被外部类强引用持有着 → 整个 Activity 或 Fragment 无法回收

  • 显式断开是唯一可靠方式:obj = null,且确保没有其他强引用路径(比如被 static Map、线程局部变量、内部类隐式持有)
  • 别依赖 System.gc():它只是建议,不保证触发,更不保证回收强引用对象

软引用适合做缓存,但别指望它“稳住”

SoftReference 的回收时机由 JVM 自行判断,规则是:**只有在即将 OOM 前的某次 GC 中才可能被回收**。它不是“内存够就永远留着”,而是“尽量留着,实在扛不住才扔”。

典型场景:图片缓存、解析后的 XML/JSON 数据缓存。

  • 不要用 softRef.get() 后不判空就直接用 —— 它随时可能返回 null,尤其在低内存设备或频繁 GC 场景下
  • 避免和强引用共存:如果同时有强引用指向同一对象,软引用就完全失效(因为对象始终强可达)
  • 想感知回收事件?得配 ReferenceQueue:new SoftReference(obj, queue),然后轮询 queue.poll()

弱引用“一扫就倒”,WeakHashMap 是它的主战场

WeakReference 的行为很干脆:**只要 GC 线程路过,不管内存多富裕,只要对象只被弱引用连着,立刻回收**。它比软引用更“佛系”,也更危险。

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

最稳妥的用途是 WeakHashMap —— 它的 key 是弱引用,当 key 对象本身没其他强引用时,整个键值对自动消失,避免内存泄漏。

  • 别用弱引用保存需要稳定访问的业务对象(比如用户 session),它可能在你调用前一秒就被清掉了
  • ThreadLocal 的底层实现就靠弱引用 key,防止线程长期运行导致 value 泄漏;但如果你忘了调用 remove(),value 仍会滞留(因为 value 是强引用)
  • 测试时别信 System.gc() 立刻生效 —— GC 线程优先级低,加 Thread.sleep(100) 再检查更靠谱

虚引用不是用来“拿对象”的,而是用来“收尸通知”的

PhantomReference 是唯一一个 .get() 永远返回 null 的引用。它不阻止回收,也不提供对象访问,存在的唯一意义是:**当对象被 finalize 之后、内存真正释放之前,JVM 会把它塞进关联的 ReferenceQueue**。

所以它只干一件事:资源清理钩子,比如关闭文件句柄、释放 off-heap 内存(ByteBuffer.allocateDirect())、记录对象销毁日志。

  • 必须搭配 ReferenceQueue 使用,否则等于白写:new PhantomReference(obj, queue)
  • 不能在 finalize() 里复活对象(已废弃),也不能在虚引用中保留强引用到原对象,否则队列永远等不到它
  • 实际开发中极少手写 —— Netty、NIO、某些高性能缓存库底层用得多,业务代码一般通过封装好的生命周期回调间接使用

真正容易被忽略的点是:四种引用不是互斥开关,而是组合工具。比如 Guava Cache 默认用软引用做 entry 缓存,但 key 用的是弱引用;又比如一个对象既被软引用又同时被弱引用持有时,弱引用那条路径会在第一次 GC 就失效,而软引用还可能苟几轮 —— 引用强度不叠加,只看最强那条链是否断裂。

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

相关专题

更多
json数据格式
json数据格式

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

2135

2023.08.07

json是什么
json是什么

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

3242

2023.08.23

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

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

1096

2023.10.13

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

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

3699

2025.09.10

Java I/O 与 NIO 编程体系合集
Java I/O 与 NIO 编程体系合集

全面讲解 Java I/O 编程的演进与核心 API,涵盖传统 I/O 的字节流(InputStream/OutputStream)与字符流(Reader/Writer)体系、装饰器模式在 I/O 中的应用(BufferedReader/InputStreamReader)、文件读写与目录操作、NIO 核心三要素(Buffer 缓冲区/Channel 通道/Selector 选择器)、ByteBuffer 操作与内存映射文件(Mappe

412

2026.04.29

guava包作用
guava包作用

guava是一个java库,增强了java标准库,提供更有效率和易于使用的集合、实用程序、缓存和并发工具。想了解更多guava的相关内容,可以阅读本专题下面的文章。

5171

2024.05.29

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

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

549

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1678

2024.03.01

OpenJDK JVM参数怎么调优
OpenJDK JVM参数怎么调优

Java应用运行缓慢,如何调整JVM参数?本专题介绍OpenJDK JVM性能调优的基本流程,涵盖性能指标确认、运行数据采集、内存配置和垃圾回收分析,帮助你先定位瓶颈,再通过对照测试验证效果,避免直接套用参数而影响应用稳定性。

60

2026.10.16

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn