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

相关推荐
xlsw_1 小时前
java全栈day20--Web后端实战(Mybatis基础2)
java·开发语言·mybatis
神仙别闹2 小时前
基于java的改良版超级玛丽小游戏
java
黄油饼卷咖喱鸡就味增汤拌孜然羊肉炒饭2 小时前
SpringBoot如何实现缓存预热?
java·spring boot·spring·缓存·程序员
暮湫3 小时前
泛型(2)
java
超爱吃士力架3 小时前
邀请逻辑
java·linux·后端
南宫生3 小时前
力扣-图论-17【算法学习day.67】
java·学习·算法·leetcode·图论
转码的小石3 小时前
12/21java基础
java
李小白663 小时前
Spring MVC(上)
java·spring·mvc
GoodStudyAndDayDayUp3 小时前
IDEA能够从mapper跳转到xml的插件
xml·java·intellij-idea
装不满的克莱因瓶4 小时前
【Redis经典面试题六】Redis的持久化机制是怎样的?
java·数据库·redis·持久化·aof·rdb