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程序可以更加高效地利用内存资源,同时也便于开发者进行特定场景下的资源管理。

相关推荐
寻星探路38 分钟前
【深度长文】万字攻克网络原理:从 HTTP 报文解构到 HTTPS 终极加密逻辑
java·开发语言·网络·python·http·ai·https
曹牧3 小时前
Spring Boot:如何测试Java Controller中的POST请求?
java·开发语言
爬山算法4 小时前
Hibernate(90)如何在故障注入测试中使用Hibernate?
java·后端·hibernate
kfyty7254 小时前
集成 spring-ai 2.x 实践中遇到的一些问题及解决方案
java·人工智能·spring-ai
猫头虎4 小时前
如何排查并解决项目启动时报错Error encountered while processing: java.io.IOException: closed 的问题
java·开发语言·jvm·spring boot·python·开源·maven
李少兄4 小时前
在 IntelliJ IDEA 中修改 Git 远程仓库地址
java·git·intellij-idea
忆~遂愿4 小时前
ops-cv 算子库深度解析:面向视觉任务的硬件优化与数据布局(NCHW/NHWC)策略
java·大数据·linux·人工智能
小韩学长yyds4 小时前
Java序列化避坑指南:明确这4种场景,再也不盲目实现Serializable
java·序列化
仟濹4 小时前
【Java基础】多态 | 打卡day2
java·开发语言
Re.不晚4 小时前
JAVA进阶之路——无奖问答挑战2
java·开发语言