Java基础(5)Java的四种引用

在Java中,根据对象的可达性(可访问性)和垃圾回收机制,引用类型被细分为四种:强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)和虚引用(Phantom Reference)。这些引用类型在java.lang.ref包中定义,主要用于辅助垃圾回收机制,以更灵活地控制对象的生命周期。

强引用(Strong Reference)

强引用是Java中最常见的引用类型。如果一个对象具有强引用,垃圾回收器绝不会回收它。只要强引用还存在,对象就会保持在内存中。

代码演示:

java 复制代码
Object obj = new Object(); // 强引用

解析:

当obj这个引用变量超出作用域或被显式设置为null之后,所引用的对象才可能被垃圾回收器回收。

软引用(Soft Reference)

软引用对于内存敏感的高速缓存实现特别有用。如果一个对象只具有软引用,那么在内存足够时它不会被回收,但在内存不足时会被回收。

代码演示:

java 复制代码
import java.lang.ref.SoftReference;

Object obj = new Object();
SoftReference<Object> softRef = new SoftReference<>(obj);
obj = null; // 清除强引用

解析:

通过上面的代码,obj原本的强引用被清除,这个对象只剩下了一个软引用softRef。这意味着,在JVM即将抛出内存不足异常之前,这个对象可能会被垃圾回收。

弱引用(Weak Reference)

如果一个对象只具有弱引用,不管内存是否足够,只要发生垃圾回收,这个对象就会被回收。

代码演示:

java 复制代码
import java.lang.ref.WeakReference;

Object obj = new Object();
WeakReference<Object> weakRef = new WeakReference<>(obj);
obj = null; // 清除强引用

解析:

通过上述代码,obj的强引用被清除,只留下一个弱引用weakRef。这意味着,下次垃圾回收器运行时,对象将被回收,无论内存是否充足。

虚引用(Phantom Reference)

虚引用完全不会影响对象的生命周期。如果一个对象仅持有虚引用,那么它和没有任何引用一样,在任何时候都可能被垃圾回收器回收。

代码演示:

java 复制代码
import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;

Object obj = new Object();
ReferenceQueue<Object> refQueue = new ReferenceQueue<>();
PhantomReference<Object> phantomRef = new PhantomReference<>(obj, refQueue);
obj = null; // 清除强引用

解析:

虚引用必须和引用队列(ReferenceQueue)联合使用。当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象之前,把这个虚引用加入到与之关联的引用队列中。虚引用主要用于确保对象被finalize后,做一些特定的资源清理工作。

总结

  • 强引用:只要强引用还在,垃圾回收器永远不会回收掉被引用的对象。
  • 软引用:在内存不足时,垃圾回收器会回收软引用所指向的对象。
  • 弱引用:一旦发生垃圾回收,弱引用指向的对象就会被回收。
  • 虚引用:虚引用不会影响对象的生命周期,任何时候都可能被垃圾回收,用于确保对象被回收时能够接收到一个系统通知。

这四种引用类型提供了更多的灵活性对于垃圾回收和对象生命周期的管理,使得Java程序可以更加高效地利用内存资源,同时也便于开发者进行特定场景下的资源管理。

相关推荐
晨曦中的暮雨2 小时前
限流算法——固定窗口、滑动窗口、漏桶、令牌桶
java·开发语言·算法
文丑颜不良啊4 小时前
LeetCode876~900题目解析
java·leetcode
aloha_7894 小时前
Java 基础、集合、异常与 JUnit 5 速查
java·junit·sqlserver
知守观5 小时前
设计模式实战:从真实老项目中看标准模板方法与工厂的落地
java·spring·设计模式
独隅5 小时前
Claude API 实战教程:从入门到完整项目
android·java·数据库·claude·claude code
Wang's Blog5 小时前
Java 项目实战: 交友项目 - 圈子功能实现:总结
java·开发语言·交友
SL_staff6 小时前
JVS私有化文档系统上线避坑指南:5大运维与业务协同断点及检测加固实践
java·开源·全栈
FinelyYang7 小时前
考试系统简答题 AI 阅卷:覆盖度驱动、异步评分与人机协同落地实践
java·大数据·人工智能
hhhjhl7 小时前
Yup 跨端三方库仓颉适配全流程
java·开发语言
用户3126874877208 小时前
Java 对象内存布局:压缩指针、对齐填充与 JOL 实测
java