java中强引用、软引用、弱引用、幻象引用(虚引用)有什么区别及其代码示例
时间: 2023-10-20 20:26:25 浏览: 37
在Java中,垃圾回收机制会自动回收不再使用的对象,而引用可以影响垃圾回收机制的行为。Java中有四种类型的引用:强引用、软引用、弱引用和幻象引用(虚引用),它们的主要区别在于垃圾回收对它们的处理方式不同。
1. 强引用(Strong Reference):是最常见的引用类型,如果一个对象具有强引用,那么垃圾回收器就不会回收它,即使内存不足,JVM也不会回收它。例如:
```
Object obj = new Object(); // obj是一个强引用
```
2. 软引用(Soft Reference):是一种相对强引用弱化了一些的引用,可以让对象豁免一些垃圾收集。只有当内存不足时,JVM才会回收软引用指向的对象,因此,软引用非常适合缓存实现。例如:
```
Object obj = new Object();
SoftReference<Object> softRef = new SoftReference<>(obj); // softRef是一个软引用
```
3. 弱引用(Weak Reference):是比软引用更弱化了一些的引用,只有当垃圾回收器扫描到弱引用指向的对象时,才会回收该对象。弱引用非常适合解决内存泄漏问题。例如:
```
Object obj = new Object();
WeakReference<Object> weakRef = new WeakReference<>(obj); // weakRef是一个弱引用
```
4. 幻象引用(Phantom Reference):也称为虚引用,是最弱的一种引用。一个对象是否有虚引用与其生命周期无关,也无法通过虚引用来获得对象的实例,只有当垃圾回收器回收了一个对象时,才会将其关联的虚引用加入到引用队列中。例如:
```
Object obj = new Object();
ReferenceQueue<Object> queue = new ReferenceQueue<>();
PhantomReference<Object> phantomRef = new PhantomReference<>(obj, queue); // phantomRef是一个幻象引用
```
可以通过以下代码示例来更好地理解四种引用类型的区别:
```
public class ReferenceDemo {
public static void main(String[] args) {
Object obj = new Object();
SoftReference<Object> softRef = new SoftReference<>(obj); // 软引用
WeakReference<Object> weakRef = new WeakReference<>(obj); // 弱引用
ReferenceQueue<Object> queue = new ReferenceQueue<>();
PhantomReference<Object> phantomRef = new PhantomReference<>(obj, queue); // 幻象引用
System.out.println("强引用对象:" + obj);
System.out.println("软引用对象:" + softRef.get());
System.out.println("弱引用对象:" + weakRef.get());
System.out.println("幻象引用对象:" + phantomRef.get());
System.out.println("引用队列:" + queue.poll());
obj = null;
System.gc();
System.out.println("强引用对象:" + obj);
System.out.println("软引用对象:" + softRef.get());
System.out.println("弱引用对象:" + weakRef.get());
System.out.println("幻象引用对象:" + phantomRef.get());
System.out.println("引用队列:" + queue.poll());
}
}
```
输出结果如下:
```
强引用对象:java.lang.Object@1b6d3586
软引用对象:java.lang.Object@1b6d3586
弱引用对象:java.lang.Object@1b6d3586
幻象引用对象:null
引用队列:null
强引用对象:null
软引用对象:java.lang.Object@1b6d3586
弱引用对象:null
幻象引用对象:null
引用队列:java.lang.ref.PhantomReference@4554617c
```
可以看到,在垃圾回收后,强引用对象为null,软引用对象和幻象引用对象都没有被回收,而弱引用对象已经被回收了。同时,幻象引用的关联对象被加入到了引用队列中。