天天看點

關于Java的軟引用及弱引用

概念介紹

1   Reference

     描述一個對象的引用。其内部維持一個queue引用,用于跟蹤對象的回收情況,當對象被回收時将目前reference引用入隊

2   SoftReference

     軟引用,僅當JVM記憶體緊張時會回收關聯對象,即JVM在抛出OOM異常之前會回收所有的SoftReference關聯的對象。

     在對象被回收之後的某個時間點(立即或延遲)進行入隊操作

3   WeakReference

     弱引用,當JVM執行垃圾回收時(如System.gc觸發)回收其關聯對象。

4   PhantomReference

     虛引用,實作了延遲可控、可再生(重複使用對象)的回收機制。

     當JVM第一次垃圾回收時并不回收關聯對象,而是直接将refercence對象入隊;

     當reference對象操作出隊(poll)時,其内部Queue對象被置換為一個特殊的NULL隊列(不允許入隊);

     于是當JVM第二次垃圾回收時嘗試将其入隊發現失敗,于是JVM才将關聯對象回收。

     為了保護虛引用對象可再生,該reference的get方法總是傳回null。

代碼示例

package reference;

import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;

public class ReferenceTest {

    public static void main(String[] args) {
        System.out.println("弱引用==============");
        testWeakReference();

        System.out.println("軟引用==============");

        testSoftReference();

        System.out.println("虛引用==============");
        testPhantomReference();
    }

    /**
     * 測試弱引用
     */
    private static void testWeakReference() {
        Object obj = new Object();

        // 建構弱引用
        ReferenceQueue<Object> refQueue = new ReferenceQueue<Object>();
        WeakReference<Object> weakRef = new WeakReference<Object>(obj, refQueue);

        // 關聯對象
        System.out.println(weakRef.get());
        // 檢查入隊情況
        System.out.println(refQueue.poll());
        obj = null;
        System.gc();

        // 延遲,等待入隊操作執行
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        // 關聯對象是否回收
        System.out.println(weakRef.get());
        // 是否入隊
        System.out.println(refQueue.poll());
    }

    /**
     * 測試軟引用
     */
    private static void testSoftReference() {
        Object obj = new Object();
        ReferenceQueue<Object> refQueue = new ReferenceQueue<Object>();
        SoftReference<Object> weakRef = new SoftReference<Object>(obj, refQueue);
        // 關聯對象
        System.out.println(weakRef.get());
        // 檢查入隊情況
        System.out.println(refQueue.poll());
        obj = null;
        System.gc();

        // 延遲,等待入隊操作執行
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        // 關聯對象是否回收
        System.out.println(weakRef.get());
        // 是否入隊
        System.out.println(refQueue.poll());
    }

    /**
     * 測試虛引用
     */
    private static void testPhantomReference() {
        Object obj = new Object();
        ReferenceQueue<Object> refQueue = new ReferenceQueue<Object>();
        PhantomReference<Object> weakRef = new PhantomReference<Object>(obj, refQueue);
        // 關聯對象
        System.out.println(weakRef.get());
        // 檢查入隊情況
        System.out.println(refQueue.poll());
        obj = null;
        System.gc();

        // 延遲,等待入隊操作執行
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        // 關聯對象是否回收
        System.out.println(weakRef.get());
        // 是否入隊
        System.out.println(refQueue.poll());

        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        System.out.println("Phantom Reference's referent recycled.");
    }
}
      

  

輸出

弱引用==============
java.lang.Object@1fb8ee3
null
null
java.lang.ref.WeakReference@14318bb
軟引用==============
java.lang.Object@ca0b6
null
java.lang.Object@ca0b6
null
虛引用==============
null
null
null
java.lang.ref.PhantomReference@1b67f74
Phantom Reference's referent recycled.      

相關博文

http://blog.sina.com.cn/s/blog_667ac0360102e9f3.html
關于Java的軟引用及弱引用

作者:

zale

出處:

http://www.cnblogs.com/littleatp/

, 如果喜歡我的文章,請

關注我的公衆号

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出

原文連結

 如有問題, 可留言咨詢.