Java 的引用
在 Java 中引用可以分为强引用、软引用、弱引用、虚引用
强引用
在 gc
中只会回收那些可达性分析不可达的对象,
软引用
只有在内存不足的时候才会回收这个对象
弱引用
只要发生 GC
就会被回收
虚引用
这个是一个不是真的在引用使用 get()
方法返回的永远都是 null
,这个引用一般都是要和 ReferenceQueue
联合使用,普遍是用来监听对象被回收的情况被执行 finalization
的阶段
参考案例
public class RefDemo {
public static void main(String[] args) throws Exception {
// 软引用
SoftReference<Object> softReferenceObj = new SoftReference<>(new Object());
// 弱引用
WeakReference<Object> weakReferenceObj = new WeakReference<>(new Object());
ReferenceQueue<Object> weakReferenceQueue = new ReferenceQueue<>();
WeakReference<Object> weakReferenceObjWithQueue = new WeakReference<>(new Object(), weakReferenceQueue);
// 虚引用
ReferenceQueue<Object> phantomReferenceQueue = new ReferenceQueue<>();
PhantomReference<Object> phantomReference = new PhantomReference<>(new Object(), phantomReferenceQueue);
System.out.println(softReferenceObj.get());
ArrayList<byte[]> bytes = new ArrayList<>();
while (true) {
System.out.println("Soft 对象:" + softReferenceObj.get());
System.out.println("Weak 对象:" + weakReferenceObj.get());
System.out.println("WeakQueue 对象:" + weakReferenceObjWithQueue.get());
System.out.println("WeakQueue Queue 对象:" + weakReferenceQueue.poll());
System.out.println("Phantom 对象:" + phantomReference.get());
System.out.println("Phantom 对象:" + phantomReferenceQueue.poll());
TimeUnit.SECONDS.sleep(1);
byte[] bt = new byte[1024 * 100];
bytes.add(bt);
if (1 == 3) break;
}
System.out.println(bytes);
}
}