Java中的强引用、软引用、弱引用和虚引用于JVM的垃圾采取机制
参考资料[*]https://juejin.cn/post/7123853933801373733
在 Java 中,引用范例分为四种:强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)和虚引用(Phantom Reference)。这些引用范例的重要区别在于它们怎样与垃圾采取器(GC)举行交互。
1. 强引用(Strong Reference)
界说:强引用是 Java 中最常见的引用范例。只要一个对象有强引用存在,垃圾采取器就不会采取这个对象。
示例:
String strongRef = new String("Hello, World!");
表明:
[*]在这段代码中,strongRef 是一个指向 String 对象的强引用。只要 strongRef 变量存在,并指向 String 对象,垃圾采取器就不会采取它。
2. 软引用(Soft Reference)
界说:软引用是一个在内存不敷时才会被垃圾采取的引用。它通常用于实现缓存,当内存不敷时,垃圾采取器会采取这些被软引用指向的对象。
示例:
import java.lang.ref.SoftReference;
String str = new String("This is a soft reference example");
SoftReference<String> softRef = new SoftReference<>(str);
// 使强引用失效
str = null;
表明:
[*]softRef 是指向 String 对象的软引用。
[*]一旦 str 置为 null,强引用消散,该对象仅通过 softRef 保持可达状态。
[*]当 JVM 发现内存不敷时,它大概会采取 softRef 指向的对象。
3. 弱引用(Weak Reference)
界说:弱引用是一个比软引用更弱的引用范例。弱引用的对象在垃圾采取过程中,只要发现弱引用,不管当前内存是否富足,都会被采取。
示例:
import java.lang.ref.WeakReference;
String str = new String("This is a weak reference example");
WeakReference<String> weakRef = new WeakReference<>(str);
// 使强引用失效
str = null;
表明:
[*]weakRef 是指向 String 对象的弱引用。
[*]一旦 str 置为 null,强引用消散,该对象仅通过 weakRef 保持可达状态。
[*]在下次垃圾采取时,无论内存是否富足,垃圾采取器都会采取 weakRef 指向的对象。
4. 虚引用(Phantom Reference)
界说:虚引用(或幻影引用)是最弱的一种引用范例。一个对象不能通过虚引用得到其引用对象。虚引用重要用于跟踪对象被垃圾采取的过程。当一个对象只剩下虚引用时,在下一次垃圾采取时会被采取。同时,虚引用必须和引用队列(ReferenceQueue)一起利用。
示例:
import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
String str = new String("This is a phantom reference example");
ReferenceQueue<String> refQueue = new ReferenceQueue<>();
PhantomReference<String> phantomRef = new PhantomReference<>(str, refQueue);
// 使强引用失效
str = null;
// 使用队列来检查虚引用对象是否被回收
if (phantomRef.isEnqueued()) {
System.out.println("Object is ready to be reclaimed by the garbage collector.");
}
表明:
[*]phantomRef 是指向 String 对象的虚引用,refQueue 是一个引用队列。
[*]一旦 str 被置为 null,对象仅通过 phantomRef 虚引用保持“存在”,但现实上已经无法通过该引用访问对象。
[*]在对象被垃圾采取后,phantomRef 会被参加到 refQueue 中,步伐可以通过 refQueue 得知对象已被采取。
ReferenceQueue 是 Java 中提供的一个队列,用于与软引用(SoftReference)、弱引用(WeakReference)、和虚引用(PhantomReference)等引用范例一起利用,以便在对象被垃圾采取时得到关照或做相应的整理工作。
ReferenceQueue 的作用
[*] 跟踪被采取的对象:ReferenceQueue 用来生存被垃圾采取器标记为可采取的引用对象。当一个对象被垃圾采取后,如果该对象的引用(软引用、弱引用或虚引用)关联了一个 ReferenceQueue,那么这个引用会被参加到 ReferenceQueue 中。
[*] 用于整理和资源管理:通过 ReferenceQueue,步伐可以在对象被采取时实行某些整理利用,比方开释外部资源、关闭文件等。特殊是虚引用(PhantomReference)必须和 ReferenceQueue 一起利用,由于虚引用的重要目标是资助检测对象的垃圾采取状态。
ReferenceQueue 的利用场景
[*] 缓存管理:团结软引用和弱引用利用,在内存不敷或对象无强引用的情况下,对象被垃圾采取器采取并参加到 ReferenceQueue,可用于从缓存中移除无用数据。
[*] 对象的生命周期管理:对于必要明确知道对象何时被垃圾采取的场景,可以利用虚引用和 ReferenceQueue,以便在对象被采取时实行某些特殊的整理利用。
示例:利用 ReferenceQueue
下面是一个利用 ReferenceQueue 和弱引用的简单示例:
import java.lang.ref.Reference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.WeakReference;
public class ReferenceQueueExample {
public static void main(String[] args) {
// 创建一个引用队列
ReferenceQueue<String> refQueue = new ReferenceQueue<>();
// 创建一个字符串对象并将其封装在一个弱引用中,同时关联引用队列
String str = new String("Hello, ReferenceQueue");
WeakReference<String> weakRef = new WeakReference<>(str, refQueue);
// 清除强引用
str = null;
// 手动调用垃圾回收器(这只是一个提示,GC 可能不会立即执行)
System.gc();
// 检查引用队列中是否有被回收的引用
Reference<? extends String> refFromQueue = refQueue.poll();
if (refFromQueue != null) {
System.out.println("The weakly referenced object has been garbage collected and the reference is in the queue.");
} else {
System.out.println("The object has not been garbage collected yet.");
}
}
}
代码表明
[*] 创建引用队列:ReferenceQueue<String> refQueue = new ReferenceQueue<>(); 创建了一个 ReferenceQueue 对象,用于生存被垃圾采取的引用。
[*] 创建弱引用:WeakReference<String> weakRef = new WeakReference<>(str, refQueue); 创建一个指向 str 的弱引用,并将其与 refQueue 关联。
[*] 扫除强引用:通过 str = null; 扫除对对象的强引用,使得该对象仅被弱引用所引用。
[*] 手动触发 GC:调用 System.gc(); 提示垃圾采取器运行。请留意,这只是一个提示,垃圾采取器不肯定会立刻实行。
[*] 查抄引用队列:通过 refQueue.poll() 查抄引用队列中是否有被采取的引用,如果返回非 null 值,则表现对象已经被采取。
总结
[*]强引用:最常见的引用范例,不会被垃圾采取。
[*]软引用:在内存不敷时会被采取,实用于缓存。
[*]弱引用:在垃圾采取时会被采取,实用于对内存敏感的数据结构,如 WeakHashMap。
[*]虚引用:不能直接访问对象内容,重要用于跟踪对象的垃圾采取情况。
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvYjc4YWFiMmM3OGM5NDEwMzk4OWM0ODhiNjMzMThjOTcucG5n
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金
页:
[1]