【面试干货】Java中的四种引用类型:强引用、软引用、弱引用和虚引用

【面试干货】Java中的四种引用类型:强引用、软引用、弱引用和虚引用

  • [1、强引用(Strong Reference)](#1、强引用(Strong Reference))
  • [2、软引用(Soft Reference)](#2、软引用(Soft Reference))
  • [3、弱引用(Weak Reference)](#3、弱引用(Weak Reference))
  • [4、虚引用(Phantom Reference)](#4、虚引用(Phantom Reference))
  • 5、总结

|-----------------------------|
| 💖The Begin💖点点关注,收藏不迷路💖 |

在Java中,除了我们常见的强引用(Strong Reference)外,还有三种引用类型:软引用(Soft Reference)、弱引用(Weak Reference)和虚引用(Phantom Reference)。它们都是Java对象引用关系中的一部分,每种引用类型在Java内存管理和垃圾回收中都扮演着不同的角色。

1、强引用(Strong Reference)

强引用 是Java中最普遍的一种引用方式。当一个对象具有强引用时,垃圾回收器永远不会回收它,即使内存空间不足。这种引用方式保证了对象在生命周期内的稳定性。

示例代码:

java 复制代码
String s = new String("abc"); // s是"abc"对象的强引用

2、软引用(Soft Reference)

软引用 用于描述还有用但非必须的对象。在内存足够的情况下,软引用的对象不会被回收;但当内存不足时,软引用的对象会被垃圾回收器回收。软引用通常用于实现内存敏感的高速缓存。

示例代码:

java 复制代码
SoftReference<String> softRef = new SoftReference<>(new String("abc")); // softRef是"abc"对象的软引用

软引用可以和引用队列(ReferenceQueue)联合使用,当软引用的对象被垃圾回收时,JVM会将这个软引用加入到与之关联的引用队列中。

3、弱引用(Weak Reference)

弱引用 与软引用类似,但具有更短的生命周期。当垃圾回收器扫描到只持有弱引用的对象时,无论当前内存是否足够,都会回收该对象的内存。弱引用通常用于实现一些不影响应用程序正常运行的缓存。

示例代码:

java 复制代码
WeakReference<String> weakRef = new WeakReference<>(new String("abc")); // weakRef是"abc"对象的弱引用

4、虚引用(Phantom Reference)

虚引用 是所有引用类型中最"弱"的一种。一个对象只持有虚引用时,它几乎与没有任何引用一样,随时可能被垃圾回收器回收。虚引用主要用于跟踪对象被垃圾回收器的活动,通常与引用队列(ReferenceQueue)一起使用。

示例代码:

java 复制代码
PhantomReference<String> phantomRef = new PhantomReference<>(new String("abc"), referenceQueue); // phantomRef是"abc"对象的虚引用

当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中。

5、总结

1、强引用:最常见的引用类型,垃圾回收器不会回收强引用的对象。

2、软引用:用于描述非必须但有用的对象,内存不足时会被回收。

3、弱引用:比软引用更"弱"的引用类型,无论内存是否足够,垃圾回收器都会回收弱引用的对象。

4、虚引用:最"弱"的引用类型,用于跟踪对象被垃圾回收器的活动,必须和引用队列一起使用。

|---------------------------|
| 💖The End💖点点关注,收藏不迷路💖 |

相关推荐
程序员游老板37 分钟前
基于SpringBoot3_vue3_MybatisPlus_Mysql_Maven的社区养老系统/养老院管理系统
java·spring boot·mysql·毕业设计·软件工程·信息与通信·毕设
福尔摩斯张1 小时前
C++核心特性精讲:从C语言痛点出发,掌握现代C++编程精髓(超详细)
java·linux·c语言·数据结构·c++·驱动开发·算法
@淡 定1 小时前
Spring中@Autowired注解的实现原理
java·后端·spring
前端一小卒1 小时前
一个看似“送分”的需求为何翻车?——前端状态机实战指南
前端·javascript·面试
时空无限1 小时前
Java Buildpack Reference
java·开发语言
xlp666hub2 小时前
C进阶之内存对齐,硬件总线和高并发伪共享的底层原理
面试·代码规范
xhxxx2 小时前
从被追问到被点赞:我靠“哨兵+快慢指针”展示了面试官真正想看的代码思维
javascript·算法·面试
爱笑的眼睛112 小时前
超越剪枝与量化:下一代AI模型压缩工具的技术演进与实践
java·人工智能·python·ai
yaoh.wang2 小时前
力扣(LeetCode) 14: 最长公共前缀 - 解法思路
python·程序人生·算法·leetcode·面试·职场和发展·跳槽
阿里云云原生2 小时前
Android App 崩溃排查指南:阿里云 RUM 如何让你快速从告警到定位根因?
android·java