JVM-Java的四种引用

引用分析

无论是通过引用计数算法判断对象的引用数量,还是通过可达性分析算法判断对象是否可达,判定对象是否可被回收都与引用有关,Java 提供了四种强度不同的引用类型

强引用:

被强引用关联的对象不会被回收,只有所有 GCRoots 都不通过强引用引用该对象,才能被垃圾回收

  • 强引用可以直接访问目标对象

  • 虚拟机宁愿抛出 OOM 异常,也不会回收强引用所指向对象

  • 强引用可能导致内存泄漏

java 复制代码
Object obj = new Object();//使用 new 一个新对象的方式来创建强引用

软引用(SoftReference):

被软引用关联的对象只有在内存不够的情况下才会被回收

java 复制代码
Object obj = new Object();
SoftReference<Object> sf = new SoftReference<Object>(obj);
obj = null;  // 使对象只被软引用关联
  • **仅(可能有强引用,一个对象可以被多个引用)**有软引用引用该对象时,在垃圾回收后,内存仍不足时会再次出发垃圾回收,回收软引用对象

  • 配合引用队列来释放软引用自身,在构造软引用时,可以指定一个引用队列,当软引用对象被回收时,就会加入指定的引用队列,通过这个队列可以跟踪对象的回收情况

  • 软引用通常用来实现内存敏感的缓存,比如高速缓存就有用到软引用;如果还有空闲内存,就可以暂时保留缓存,当内存不足时清理掉,这样就保证了使用缓存的同时不会耗尽内存

弱引用(WeakReference):

被弱引用关联的对象一定会被回收,只能存活到下一次垃圾回收发生之前,即发生垃圾回收时一定会回收弱引用

java 复制代码
Object obj = new Object();
WeakReference<Object> wf = new WeakReference<Object>(obj);
obj = null;
  • 仅有弱引用引用该对象时,在垃圾回收时,无论内存是否充足,都会回收弱引用对象

  • 配合引用队列来释放弱引用自身

  • WeakHashMap 用来存储图片信息,可以在内存不足的时候及时回收,避免了 OOM

虚引用(PhantomReference):

也称为幽灵引用或者幻影引用,是所有引用类型中最弱的一个,引入虚引用主要是为了释放直接内存

java 复制代码
Object obj = new Object();
PhantomReference<Object> pf = new PhantomReference<Object>(obj, null);
obj = null;
  • 一个对象是否有虚引用的存在,不会对其生存时间造成影响,也无法通过虚引用得到一个对象

  • 为对象设置虚引用的唯一目的是在于跟踪垃圾回收过程,能在这个对象被回收时收到一个系统通知

  • 必须配合引用队列使用,主要配合 ByteBuffer 使用 ,被引用对象回收时会将虚引用入队,由 Reference Handler 线程调用虚引用相关方法释放直接内存

相关推荐
我是无敌小恐龙10 分钟前
Java基础入门Day10 | Object类、包装类、大数/日期类、冒泡排序与Arrays工具类 超详细总结
java·开发语言·数据结构·算法·贪心算法·排序算法·动态规划
极客先躯14 分钟前
高级java每日一道面试题-2025年12月07日-实战篇[Dockerj]-Docker daemon 的配置文件在哪里?常用的配置项有哪些?
java·docker·配置文件的实际位置·配置文件的格式规则·常用配置项全景与分类·配置如何生效·daemon 配置折射架构思维
云烟成雨TD18 分钟前
Spring AI Alibaba 1.x 系列【49】状态图运行时引擎:CompiledGraph 源码解析
java·人工智能·spring
yuanyuan2o226 分钟前
从最小项目开始的 CMake 教程
c语言·开发语言·arm开发·c++·makefile·make·cmake
lifewange28 分钟前
pytest 找不到文件?直接在 pytest.ini 配置根目录 + 路径(最简单方案)
开发语言·python·pytest
大鹏说大话36 分钟前
MySQL + Redis + Caffeine:Java后端通用三级缓存架构实战
开发语言
yuanpan39 分钟前
Python 桌面 GUI 入门开发:从 tkinter 窗口到简易记事本
开发语言·python
Tutankaaa41 分钟前
从10队到50队:知识竞赛软件的高并发场景如何设计?
java·经验分享·后端·spring
下次再写1 小时前
微服务架构实战:Spring Boot + Spring Cloud 从入门到精通
java·spring boot·spring cloud·微服务架构·服务注册与发现·分布式系统·api网关
bang冰冰1 小时前
Trae工具安装和使用教程(新手零基础入门,全程无坑)
java·人工智能·python