java中强引用、软引用、弱引用、幻象引用(虚引用)有什么区别及其代码示例
时间: 2023-10-20 15:23:25 浏览: 36
Java中的四种引用类型有不同的生命周期和回收机制,它们分别是:
1.强引用(Strong Reference):强引用是最常见的引用类型,如果一个对象具有强引用,那么它就不会被垃圾回收器回收,即使内存不足时也不会被回收。可以使用 new 关键字创建一个强引用。
```
Object obj = new Object(); //创建一个强引用
```
2.软引用(Soft Reference):软引用是一种比强引用弱一些的引用类型,在内存不足时可能会被垃圾回收器回收。可以使用 SoftReference 类来创建一个软引用。
```
SoftReference<Object> softRef = new SoftReference<>(obj); //创建一个软引用
```
3.弱引用(Weak Reference):弱引用比软引用更弱一些,它只能存活到下一次垃圾回收之前。可以使用 WeakReference 类来创建一个弱引用。
```
WeakReference<Object> weakRef = new WeakReference<>(obj); //创建一个弱引用
```
4.幻象引用(Phantom Reference):幻象引用也叫虚引用,它是最弱的一种引用,无法通过引用获取到对象实例,也无法通过幻象引用将对象恢复。可以使用 PhantomReference 类来创建一个幻象引用。
```
PhantomReference<Object> phantomRef = new PhantomReference<>(obj, referenceQueue); //创建一个幻象引用
```
其中,referenceQueue 是一个对象队列,当幻象引用所引用的对象被垃圾回收器回收时,该对象会被加入到 referenceQueue 中。
示例代码如下:
```
import java.lang.ref.*;
public class ReferenceTest {
public static void main(String[] args) {
// 创建一个强引用
Object strongObj = new Object();
// 创建一个软引用
SoftReference<Object> softRef = new SoftReference<>(strongObj);
// 创建一个弱引用
WeakReference<Object> weakRef = new WeakReference<>(strongObj);
// 创建一个幻象引用
ReferenceQueue<Object> referenceQueue = new ReferenceQueue<>();
PhantomReference<Object> phantomRef = new PhantomReference<>(strongObj, referenceQueue);
// 输出各个引用的状态
System.out.println("strongObj: " + strongObj);
System.out.println("softRef: " + softRef.get());
System.out.println("weakRef: " + weakRef.get());
System.out.println("phantomRef: " + phantomRef.get());
// 将 strongObj 置为 null,使其成为垃圾
strongObj = null;
// 通知垃圾回收器回收垃圾
System.gc();
// 输出各个引用的状态
System.out.println("strongObj: " + strongObj);
System.out.println("softRef: " + softRef.get());
System.out.println("weakRef: " + weakRef.get());
System.out.println("phantomRef: " + phantomRef.get());
// 输出 referenceQueue 中的对象
Reference<?> ref;
while ((ref = referenceQueue.poll()) != null) {
System.out.println("referenceQueue: " + ref);
}
}
}
```
输出结果:
```
strongObj: java.lang.Object@4d7e1886
softRef: java.lang.Object@4d7e1886
weakRef: java.lang.Object@4d7e1886
phantomRef: null
strongObj: null
softRef: java.lang.Object@4d7e1886
weakRef: null
phantomRef: null
referenceQueue: java.lang.ref.PhantomReference@6d06d69c
```