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

相关推荐
微学AI4 小时前
基于openEuler操作系统的Docker部署与AI应用实践操作与研究
后端
王元_SmallA4 小时前
IDEA + Spring Boot 的三种热加载方案
java·后端
LCG元4 小时前
实战:用 Shell 脚本自动备份网站和数据库,并上传到云存储
后端
Yeats_Liao4 小时前
时序数据库系列(四):InfluxQL查询语言详解
数据库·后端·sql·时序数据库
清空mega4 小时前
从零开始搭建 flask 博客实验(常见疑问)
后端·python·flask
白衣鸽子4 小时前
MySQL数据库的“隐形杀手”:深入理解文件结构与治理数据碎片
数据库·后端·mysql
neoooo4 小时前
⚙️ Spring Boot × @RequiredArgsConstructor:写出最干净的依赖注入代码
spring boot·后端·spring
Victor3565 小时前
Redis(111)Redis的持久化机制有哪些?
后端
Victor3565 小时前
Redis(110)Redis的发布订阅机制如何使用?
后端
Python私教5 小时前
使用 FastAPI 实现文件上传接口:从入门到进阶
后端