首页 > Java > java教程 > 正文

Java里的强引用弱引用有什么区别_Java四种引用类型机制说明

P粉602998670
发布: 2025-12-13 11:47:35
原创
835人浏览过
强引用阻止GC回收,弱引用在GC时立即回收,软引用在内存不足时回收,虚引用不阻止回收仅用于跟踪回收时机。

java里的强引用弱引用有什么区别_java四种引用类型机制说明

强引用和弱引用的核心区别在于:GC是否“尊重”它们的存在。强引用像一道铁闸,只要它在,对象就绝不会被回收;弱引用则像一张薄纸,GC扫到就收,不管内存够不够。

强引用:默认、强硬、不妥协

Object obj = new Object(); 就是典型的强引用。它的特点是:

  • 只要至少一个强引用指向对象,GC就完全无视内存压力,死守不放
  • 哪怕堆内存快爆了,JVM宁可抛 OutOfMemoryError,也不会动它
  • 只有显式设为 null,或变量超出作用域,对象才变成“可回收候选”
  • 日常开发中95%以上的对象引用都是强引用

弱引用:GC一见就收,不讲条件

WeakReference weakRef = new WeakReference(new Object()); 它的关键行为是:

  • 下一次GC运行时,无论内存是否充足,只要对象只被弱引用持有,就会被立即回收
  • get() 方法随时可能返回 null,使用前必须判空
  • 常用于规范化映射(如 WeakHashMap),避免因缓存导致内存泄漏
  • 适合存放临时、可再生、生命周期短的数据,比如线程上下文快照

软引用:内存告急时的缓冲带

SoftReference softRef = new SoftReference(new Object()); 它介于强与弱之间:

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

小爱开放平台
小爱开放平台

小米旗下小爱开放平台

小爱开放平台 291
查看详情 小爱开放平台
  • 内存充足时,它表现得像强引用,稳稳留住对象
  • JVM判断“即将OOM”前,会批量清理软引用对象,属于“被动让步”
  • 典型用途是内存敏感型缓存,如图片、模板、解析结果等
  • 回收时机由JVM实现决定(如HotSpot基于最近使用时间和堆剩余空间估算)

虚引用:不挡GC,只发通知

PhantomReference phantRef = new PhantomReference(obj, queue); 它最特殊:

  • 无法通过 get() 获取对象(始终返回 null),对对象生命周期零影响
  • 必须配合 ReferenceQueue 使用,对象被回收前,虚引用会被入队
  • 主要用于跟踪对象回收时机,做资源清理(如直接内存释放、文件句柄关闭)
  • 是四种引用中唯一不能单独“保活”对象的类型

本质上,四种引用是Java给GC传递的不同“优先级指令”:强引用说“别动”,软引用说“缺内存再动”,弱引用说“下次就动”,虚引用说“动之前喊我一声”。用对场景,才能既保性能又防泄漏。

基本上就这些。

以上就是Java里的强引用弱引用有什么区别_Java四种引用类型机制说明的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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