其中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<>();
}