java引用方式

垃圾回收的機制主要是看對象是否有引用指向該對象,java對象的引用包括:強引用,軟引用,弱引用,虛引用

1.強引用

 是指創建一個對象並把這個對象賦給一個引用變量。

 強引用有引用變量指向時永遠不會被垃圾回收,JVM寧願拋出OutOfMemory錯誤也不會回收這種對象。 

Object obj = new Object();


可直接通過obj取得對應的對象 如obj.equels(new Object());

2.   軟引用:

非必須引用,內存溢出之前進行回收,可以通過以下代碼實現
Object obj = new Object();
SoftReference<Object> sf = new SoftReference<Object>(obj);
obj = null;
sf.get();//有時候會返回null
這時候sf是對obj的一個軟引用,通過sf.get()方法可以取到這個對象,當然,當這個對象被標記爲需要回收的對象時,則返回null;
軟引用主要用戶實現類似緩存的功能,在內存足夠的情況下直接通過軟引用取值,無需從繁忙的真實來源查詢數據,提升速度;當內存不足時,自動刪除這部分緩存數據,從真正的來源查詢這些數據。

軟引用可用來實現內存敏感的高速緩存。 

//定義一個HashMap,保存軟引用的Bitmap對象,可防止OOM
    private Map<String, SoftReference<Bitmap>> imageCaches =             
        Collections.synchronizedMap(new HashMap<String, SoftReference<Bitmap>>());

 /**添加軟引用Bitmap到Map中,使其緩存*/
    public void addBitmapToCache(String path) {
        imageCaches.put(path, new SoftReference<Bitmap>                                
           (BitmapFactory.decodeFile(path)));
    }
    /** 從緩存中取軟引用的Bitmap對象*/
    public Bitmap getBitmapFromCache(String path) {
        SoftReference<Bitmap> softBitmap = imageCaches.get(path);
        //如果軟引用還存在,那麼直接就可以獲取這個對象的相關數 據...這樣就實現了cache...
        if (softBitmap != null) {
            return softBitmap.get();
        } else {
            //重新實例化對象,獲取數據信息
        }
    }

3.    弱引用(WeakReference)

  弱引用也是用來描述非必需對象的,當JVM進行垃圾回收時,無論內存是否充足,都會回收被弱引用關聯的對象。在java中,用java.lang.ref.WeakReference類來表示。

4.    虛引用

    虛引用主要用來跟蹤對象被垃圾回收器回收的活動。虛引用與軟引用和弱引用的一個區別在於:虛引用必須和引用隊列 (ReferenceQueue)聯合使用。當垃圾回收器準備回收一個對象時,如果發現它還有虛引用,就會在回收對象的內存之前,把這個虛引用加入到與之 關聯的引用隊列中。

ReferenceQueue queue = new ReferenceQueue ();

PhantomReference pr = new PhantomReference (object, queue); 

程序可以通過判斷引用隊列中是否已經加入了虛引用,來了解被引用的對象是否將要被垃圾回收。如果程序發現某個虛引用已經被加入到引用隊列,那麼就可以在所引用的對象的內存被回收之前採取必要的行動

 

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