java Reference

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

4. 參考

  1. http://www.cnblogs.com/newcj/archive/2011/05/15/2046882.html
  2. http://mindprod.com/jgloss/phantom.html
  3. http://www.importnew.com/17019.html
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章