java.lang.ref 的引用

 

入門比較參考這裏:http://mindprod.com/jgloss/phantom.html

 

 可以參考這裏,已經很全面了,有時間應該翻譯一下吧

http://www.kdgregory.com/index.php?page=java.refobj

這裏的討論很不錯

http://www.javalobby.org/forums/thread.jspa?threadID=16520

 

 

 

 

 

jvm 的垃圾回原理可以參考這裏:

http://mindprod.com/jgloss/garbagecollection.html

http://www-01.ibm.com/support/docview.wss?uid=csc1665d3ff3ebd54e0fc825719a0027c278

 

 

最後,網上有些程序,改了改,原文是

http://www.k99k.com/texts/java-reference.html

可以考慮一下下面這個,稍微改了點,運行不會停

 


 

import java.lang.ref.PhantomReference;
import java.lang.ref.Reference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;
import java.util.IdentityHashMap;
import java.util.Map;

class Grocery {
    private static final int SIZE = 10000;
    // 屬性d使得每個Grocery對象佔用較多內存,有80K左右
    private double[] d = new double[SIZE];
    private String id;

    public Grocery(String id) {
        this.id = id;
    }

    public String toString() {
        return id;
    }

    public void finalize() {
        System.out.println("Finalizing " + id);
    }

    public double[] getD() {
        return d;
    }

    public void setD(double[] d) {
        this.d = d;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }
   
   
}

public class References {
    private static final int size = 10;
    private static int sc = size;
    private static int wc = size;
    private static int pc = size;
   
    private static ReferenceQueue<Grocery> rq = new ReferenceQueue<Grocery>();

    public static void checkQueue(Map<Reference<?>, Reference<?>> refs ) {
        Reference<? extends Grocery> inq = rq.poll(); // 從隊列中取出一個引用
        if (inq != null && !refs.isEmpty()) {
            System.out.println("------------------ In queue: " + inq + " : " + inq.get());
            refs.remove(inq);
           
            if(SoftReference.class.isAssignableFrom(inq.getClass()) ) {
                sc--;
            } else if(WeakReference.class.isAssignableFrom(inq.getClass()) ) {
                wc--;
            } else if(PhantomReference.class.isAssignableFrom(inq.getClass()) ) {
                pc--;
            }


            System.out.printf("/t sc remains %2d, wc remains %2d, pc remains %2d/n", sc, wc, pc);
        }
    }

    public static void main(String[] args) {
        Map<Reference<?>, Reference<?>> refs = new IdentityHashMap<Reference<?>, Reference<?>>();
       
       

        // 創建10個Grocery對象以及10個軟引用
        for (int i = 0; i < size; i++) {
            SoftReference<Grocery> ref = new SoftReference<Grocery>(
                    new Grocery("Soft " + i), rq);
            refs.put(ref,null);
            System.out.println("Just created: " + ref);
        }
        System.gc();
        checkQueue(refs);

        // 創建10個Grocery對象以及10個弱引用
        for (int i = 0; i < size; i++) {
            WeakReference<Grocery> ref = new WeakReference<Grocery>(
                    new Grocery("Weak " + i), rq);
            System.out.println("Just created: " + ref);
            refs.put(ref,null);
        }
        System.gc();
        checkQueue(refs);

        // 創建10個Grocery對象以及10個虛引用
        for (int i = 0; i < size; i++) {
            PhantomReference<Grocery> ref = new PhantomReference<Grocery>(
                    new Grocery("Phantom " + i), rq);
            System.out.println("Just created: " + ref);
            refs.put(ref,null);
        }
        System.gc();
        checkQueue(refs);

       
        for(;true;) {
            System.gc();
            checkQueue(refs);
        }
    }
}

發佈了43 篇原創文章 · 獲贊 5 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章