👌软引用和虚引用适用场景

👌软引用和虚引用适用场景

题目详细答案

软引用

软引用主要用于实现内存敏感的缓存。

软引用可以用于缓存那些可以在内存不足时安全回收的对象。例如,图片缓存、数据缓存等场景。在内存充足时,缓存的对象不会被回收;当内存不足时,缓存的对象会被回收以释放内存。这种机制可以在不影响应用程序功能的前提下,最大限度地利用可用内存。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import java.lang.ref.SoftReference;
import java.util.HashMap;
import java.util.Map;

public class SoftReferenceCache<K, V> {
private final Map<K, SoftReference<V>> cache = new HashMap<>();

public void put(K key, V value) {
cache.put(key, new SoftReference<>(value));
}

public V get(K key) {
SoftReference<V> ref = cache.get(key);
if (ref != null) {
return ref.get();
}
return null;
}
}

SoftReferenceCache使用软引用来缓存对象,当内存不足时,缓存的对象可能会被回收。

虚引用

虚引用主要用于跟踪对象被垃圾收集器回收的时间,通常用于实现特殊的清理机制。

虚引用可以用于管理那些需要在对象被回收后进行清理的资源,例如直接内存(Direct Memory)、文件句柄等。

当对象被垃圾收集器回收时,虚引用会被放入引用队列(ReferenceQueue),通过处理这个队列,可以执行必要的清理操作。

虚引用可以用于监控对象何时被回收,从而在对象回收时执行一些特定的操作,例如记录日志、更新状态等。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;

public class PhantomReferenceExample {
public static void main(String[] args) throws InterruptedException {
ReferenceQueue<Object> refQueue = new ReferenceQueue<>();
Object obj = new Object();
PhantomReference<Object> phantomRef = new PhantomReference<>(obj, refQueue);

obj = null; // 允许 obj 对象被垃圾收集器回收

// 强制垃圾收集
System.gc();

// 检查引用队列
if (refQueue.poll() != null) {
System.out.println("Object has been collected");
// 执行清理操作
}
}
}

当obj被垃圾收集器回收时,phantomRef会被放入refQueue中,可以通过检查refQueue来执行清理操作。

 wechat
天生我才必有用