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

Java 中强引用、软引用、弱引用、虚引用怎么区别与选择

落萱君_7603

落萱君_7603

发布时间:2026-09-30 15:44:10

|

652人浏览过

|

来源于php中文网

原创

Java四种引用的核心区别在于GC回收策略不同:强引用绝不回收,软引用内存紧张时回收,弱引用每次GC都回收,虚引用不阻止回收仅通知回收。

java 中强引用、软引用、弱引用、虚引用怎么区别与选择

Java 中四种引用的核心区别在于:GC 对它们的回收策略不同,直接决定了对象的存活时间与使用目的。选哪种,关键看你要不要让对象“被回收”、什么时候回收、以及是否需要感知回收动作。

强引用:默认且最硬,不回收是底线

Object obj = new Object() 就是强引用。只要这个变量还指向对象,GC 绝对不会动它——哪怕内存快爆了,JVM 宁愿抛 OutOfMemoryError 也不会回收。它适合所有必须长期存活的业务对象,比如 Service 实例、配置类、用户会话数据等。

注意点:

  • 强引用滥用是内存泄漏主因,比如缓存 Map 里长期存着大对象又不清理;
  • 用完记得显式置 null(尤其在长生命周期容器中),帮助 GC 判断可达性;
  • ArrayList 的 clear() 方法把每个元素设为 null,就是为释放强引用链。

软引用:内存紧张时才放手,适合缓存

SoftReference<T> softRef = new SoftReference<>(obj)。它像一个“弹性缓存开关”:内存够用就留着,OOM 前 GC 会优先清掉它。典型场景是图片缓存、HTML 页面缓存、查询结果缓存等。

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

建议用法:

javascript-pro
javascript-pro

专注现代 ECMAScript、异步编程、性能优化和全栈的 JavaScript 专家,适用于现代开发

下载
  • 搭配 ReferenceQueue 使用,可监控哪些缓存项被回收;
  • 不要依赖它“一定不被回收”,get() 返回 null 是正常情况,每次取值前必须判空;
  • 它不能防止 OOM,只是延缓——如果缓存对象太大或太多,软引用照样救不了。

弱引用:GC 一来就走,防泄漏利器

WeakReference<T> weakRef = new WeakReference<>(obj)。只要发生任意一次 GC,不管内存多宽裕,对象立刻被回收。它的核心价值不是“保对象”,而是“不拦着回收”。

典型用途:

  • WeakHashMap:key 是弱引用,避免 key 持有导致 value 无法释放;
  • ThreadLocal 的内部实现:value 关联的 key 是弱引用,防止线程长期运行时 ThreadLocalMap 泄漏;
  • 监听器注册表:避免监听器对象被持有而无法回收。

务必注意:weakRef.get() 可能随时返回 null,每次访问都得检查。

虚引用:不挡回收,只发通知

PhantomReference<T> phanRef = new PhantomReference<>(obj, queue)。它最特殊:get() 永远返回 null,完全无法访问对象本身。唯一作用是——当对象被 GC 回收前,JVM 会把它加入关联的 ReferenceQueue,让你知道“它要没了”。

适用场景有限但关键:

  • 堆外内存(如 DirectByteBuffer)的资源清理;
  • 敏感对象销毁前的审计日志或状态归档;
  • 必须配合 ReferenceQueue 使用,单独创建虚引用毫无意义。

引用强度从高到低是:强 > 软 > 弱 > 虚。选择本质是权衡:你要的是确定性(强)、弹性(软)、无阻碍(弱),还是事后通知(虚)。实际开发中,95% 场景用强引用;缓存加一层软引用;防泄漏用弱引用;系统级资源管理才用虚引用。

热门AI工具

更多
Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

WorkBuddy

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

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

豆包大模型

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

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

DeepSeek

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

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

9357

2023.06.15

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

6522

2023.07.05

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

5812

2023.07.31

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1024

2023.08.01

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

848

2023.08.02

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

1216

2023.08.02

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2469

2023.08.02

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

19811

2023.08.03

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

0

2026.09.30

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
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