1. 介紹
在java當中一切事物皆對象。那麼每一個對象都在內存當中有自己的位置,當引用獲取不得指向的對象的時候,java垃圾回收機制就會將此引用清理。
但經過Reference包裝過的引用,根據包裝的強度不同,在回收的時候也有不同的調度。
Reference子類:SoftReference,WeakReference,PhantomReference;按強度等級排列。
2. api接口:
Reference | get | 獲取引用所指向的對象,若被回收返回空 |
ReferenceQueue | poll | 遍歷隊列,查看是否存在可用的引用對象,若存在,移除並返回,否則返回空 |
ReferenceQueue | remove | 移除隊列中下一個引用對象 |
3. Reference區別
引用說明 | 特點 | 使用場景 |
---|---|---|
Strong Reference(強引用) | 只要對象存在引用,一直可以存活 | 正常使用比如:new |
Soft Reference(軟引用) | 內存充足的時候,一直可以存活 | 緩存 |
Weak Reference(弱引用) | 對象只要被使用,一直可以存活 | 在垃圾回收之後獲取對象 |
Phantom Reference(幽靈引用) | get返回一直爲Null。 | 標識對象何時被回收 |
package com.pgy.collection;
import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;
public class ReferenceDemo2 {
private static ReferenceQueue<Object> objQueue = new ReferenceQueue<Object>();
public static void main(String[] args) {
Object obj = null;
System.out.println("****************testSoftReference*******************");
testSoftReference(obj);
System.out.println("****************testWeakReference*******************");
testWeakReference(obj);
System.out.println("****************testPhantomReference*******************");
testPhantomReference(obj);
}
private static void testSoftReference(Object obj) {
obj = new Object();
SoftReference<Object> sr = new SoftReference<Object>(obj, objQueue);
System.out.println(sr.get());
System.out.println(objQueue.poll());
obj = null;
System.gc();
System.out.println(sr.get());
System.out.println(objQueue.poll());
}
private static void testWeakReference(Object obj) {
obj = new Object();
WeakReference<Object> wr = new WeakReference<Object>(obj, objQueue);
System.out.println(wr.get());
System.out.println(objQueue.poll());
obj = null;
System.gc();
System.out.println(wr.get());
System.out.println(objQueue.poll());
}
private static void testPhantomReference(Object obj) {
obj = new Object();
PhantomReference<Object> pr = new PhantomReference<Object>(obj, objQueue);
System.out.println(pr.get());
System.out.println(objQueue.poll());
obj = null;
System.gc();
System.out.println(pr.get());
System.out.println(objQueue.poll());
}
}
//console
//****************testSoftReference*******************
//java.lang.Object@280bca
//null
//java.lang.Object@280bca
//null
//****************testWeakReference*******************
//java.lang.Object@1817fe89
//null
//null
//java.lang.ref.WeakReference@717e5fde
//****************testPhantomReference*******************
//null
//null
//null
//java.lang.ref.PhantomReference@39fc0f04