软引用(SoftReference)是一种比弱引用生存期更长的引用。只有当JVM进行垃圾回收时,空间不足时,才会回收被软引用关联的对象。
软引用的作用是:
- 允许对象在出发垃圾回收时被回收,主要用于内存敏感的程序中,整体提高程序性能。
- 软引用常用于实现内存敏感的高速缓存。长期不使用的缓存对象会被回收。
- 当堆空间不足时,会把软引用关联的对象列为回收候选,优先回收软引用关联的对象。
我们可以通过java.lang.ref.SoftReference类来实现软引用。构造方法为:
SoftReference(T referent)
其中T是指向对象的类型。我们还需要关注其中的get()方法来获取软引用关联的对象。
来看一个简单示例:
public class SoftRefDemo {
public static void main(String[] args) {
Object obj1 = new Object();
SoftReference<Object> ref1 = new SoftReference<>(obj1);
obj1 = null; // obj1可被回收
System.gc(); // 显式调用GC,obj1不会被回收
if(ref1.get() != null) {
System.out.println("obj1未被回收");
}
}
}
执行结果为:
obj1未被回收
在该示例中:
- obj1作为软引用ref1的关联对象。
- 设置obj1为null,使其成为垃圾。
- 显式调用GC,由于还有足够的内存,obj1不会被回收。
- 通过ref1.get()检查关联对象,发现未被回收,返回非null值。