四种引用解析

一、四种引用分别是什么?(通俗比喻)

把对象比作手机

  1. 强引用手里紧紧攥着,扔不掉
  2. 软引用放包里,内存够就留着,不够就扔
  3. 弱引用放桌上,GC 一来就拿走
  4. 虚引用贴个标签,根本拿不到手机,只用来跟踪回收

二、专业定义 + 回收时机(面试标准答案)

1. 强引用(Strong Reference)

默认引用,平时写的 99% 都是它

复制代码
Object obj = new Object();

特点

  • 最强
  • 只要强引用还在,GC 永远不会回收
  • 内存不够直接抛 OOM

回收时机

永远不回收,除非 obj = null

使用场景

所有业务对象、普通变量


2. 软引用(Soft Reference)

内存不够才回收,用于缓存

复制代码
SoftReference<Object> sr = new SoftReference<>(obj);

特点

  • 内存充足:不回收
  • 内存不足:立即回收
  • 回收后返回 null

回收时机

OOM 前最后一刻回收

使用场景

缓存(图片缓存、网页缓存)


3. 弱引用(Weak Reference)

GC 一来就回收

复制代码
WeakReference<Object> wr = new WeakReference<>(obj);

特点

  • 不管内存够不够
  • 只要发生 GC,立即回收

回收时机

每次 GC 必收

使用场景

临时缓存、ThreadLocal、WeakHashMap


4. 虚引用(Phantom Reference)

最弱,等于没有引用,只为了监听回收

复制代码
ReferenceQueue queue = new ReferenceQueue();
PhantomReference<Object> pr = new PhantomReference<>(obj, queue);

特点

  • 永远拿不到对象
  • 必须配合 引用队列 使用
  • 唯一作用:监听对象什么时候被回收

回收时机

和没有引用一样,随时会被回收

使用场景

堆外内存释放、NIO、监控对象回收


三、一张表彻底分清(面试直接背)

引用类型 回收时机 强度 用途
强引用 永不回收(除非置 null) 最强 业务对象
软引用 内存不足才回收 缓存
弱引用 GC 一来就回收 ThreadLocal、临时缓存
虚引用 随时回收,拿不到对象 最弱 监听回收、堆外内存

四、最关键的 3 句总结

  1. 强引用 = 绝不回收
  2. 软引用 = 内存不够才回收
  3. 弱引用 = 一 GC 就回收
  4. 虚引用 = 拿不到对象,只监听回收
相关推荐
zh1570239 小时前
JavaScript中WorkerThreads解决服务端计算瓶颈
jvm·数据库·python
2401_8714928510 小时前
Vue.js监听器watch利用回调函数处理级联下拉框数据联动
jvm·数据库·python
zhoutongsheng12 小时前
C#怎么实现Swagger文档 C#如何在ASP.NET Core中集成Swagger自动生成API文档【框架】
jvm·数据库·python
gmaajt15 小时前
Golang怎么做国际化多语言_Golang i18n教程【核心】
jvm·数据库·python
maqr_11015 小时前
CSS如何利用Sass定义全局阴影方案_通过变量实现统一CSS风格
jvm·数据库·python
m0_6138562915 小时前
uni-app怎么做类似于美团的商家评价星级 uni-app五星评分组件制作【实战】
jvm·数据库·python
2401_8330336216 小时前
如何修复固定定位头部容器中悬浮下拉菜单的错位问题
jvm·数据库·python
z44247532616 小时前
CSS Grid布局如何实现网格项目的自动增长_设置grid-auto-flow- row
jvm·数据库·python
m0_7403524217 小时前
如何在 SvelteKit 中为动态加载的图片实现响应式悬停覆盖层
jvm·数据库·python
gmaajt17 小时前
JavaScript中闭包对垃圾回收器GC标记清除算法的影响
jvm·数据库·python