java編程思想 持有對象(三種弱引用與WeakHashMap)

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章