其中SoftReference只在內存不夠時回收其包含的對象,WeakReference則在任何時候都可能回收。而PhantomReference則最弱(虛引用),任何時候都不能從中get對象(只會得到null),而且必須和ReferenceQueue一起使用,它存在的目的就是監控包含對象被釋放的事件,從而可以起到finalize的作用,即可以做最後的善後工作。(finalize已於java SE9棄用)
相關博客:https://www.cnblogs.com/cord/p/11546303.html
https://blog.csdn.net/zqz_zqz/article/details/79474314
https://www.cnblogs.com/dfyz/articles/5389122.html
https://blog.csdn.net/u014294681/article/details/86511451
另,關於引用鏈的等級的表述來自:https://www.cnblogs.com/xdouby/p/6701941.html(害怕到時候鏈接掛了所以截圖了,侵刪)
關於WeakHashMap
WeakHashMap的鍵是WeakReference類型的,其中有一個ReferenceQueue(域名queue),在運行中GC可能會回收一些鍵的空間(因爲其是WeakReference,而且會被放入queue),而每次調用時都會同步queue和鍵值對信息,並從鍵值對中刪除所有被回收的鍵。
這一部分應該會用於有大量大型且不常使用的數據的情況,每次使用時如果發現對象沒有被回收則正常使用,否則重新構建對象。
貼上代碼,寫的不太好
import java.lang.ref.*;
import java.util.LinkedList;
import java.util.WeakHashMap;
public class Ans {
static class VeryBig {
VeryBig(String s) {name = s; }
VeryBig(int t) {i = new long[t];}
@Override
public String toString() {
return "VeryBig{" +
"name='" + name + '\'' +
'}';
}
@Override
protected void finalize() throws Throwable {
System.out.println("final "+name);
}
long []i = new long[10000];
String name;
}
static void check() {
Reference<? extends VeryBig> r = rq.poll();
if (r!=null) System.out.println("In queue "+r);
else System.out.println("NULL");
}
public static void main(String[] args) {
LinkedList<SoftReference<VeryBig>> sr = new LinkedList<>();
LinkedList<VeryBig> vb = new LinkedList<>();
LinkedList<WeakReference<VeryBig>> wr = new LinkedList<>();
LinkedList<PhantomReference<VeryBig>> pr = new LinkedList<>();
SoftReference<VeryBig> s = new SoftReference<>(new VeryBig("S"),rq);
//WeakReference<VeryBig> w = new WeakReference<>(new VeryBig("S"),rq);
Reference<?> r;
//while ((r=rq.poll())==null) {sr.add(new SoftReference<>(new VeryBig(1000)));System.out.println("1");}
System.out.println("YES");
while(true) {
sr.add(new SoftReference<>(new VeryBig(1000 ),rq));
check();
}
/* for (int i = 0;i<5000;) {
//if (i%100==0) vb = new LinkedList<>();
System.out.println(i);
vb.add(new VeryBig("Soft "+i));
//System.out.println("just "+sr.getLast().get());
// check();
}*/
/*for (int i = 0;i<5000;++i) {
wr.add(new WeakReference<>(new VeryBig("Weak "+i),rq));
//System.out.println("just "+wr.getLast().get());
check();
}*/
//System.gc();
/* for (int i = 0;i<300;++i) {
pr.add(new PhantomReference<>(new VeryBig("Ph "+i),rq));
//System.out.println("just "+pr.getLast().get());
//check();
}*/
//System.out.println(pr.get(3).get());
}
static ReferenceQueue<VeryBig> rq = new ReferenceQueue<>();
}