1. 程式人生 > >java中的各種引用介紹

java中的各種引用介紹

主要講解軟引用和弱引用的概念以及引用佇列的用法,最後介紹了weakhashmap,關於自定義使用軟引用結合hashmap構建快取,可以看參考文章,以後有機會也會專門寫一篇介紹。

java中各種引用存活週期

強引用>軟引用>弱引用>虛引用。

  • StrongReference-jvm記憶體不足時也不會回收,直至OOM。
  • SoftReference-jvm進行垃圾回收,記憶體不足,避免OOM會對軟引用的物件進行回收。
  • WeakReference-JVM進行垃圾回收時會回收弱引用,無論記憶體是否緊張。
  • PhantomReference-任何時候都可能被回收。

軟引用和弱引用概念區分

Soft reference objects, which are cleared at the discretion of the garbage collector in response to memory demand. Soft references are most often used to implement memory-sensitive caches.
All soft references to softly-reachable objects are guaranteed to have been cleared before the virtual machine throws an OutOfMemoryError.

對於軟引用因為記憶體需求會被釋放。丟擲OOM之前確定所有軟引用被釋放。

Weak reference objects, which do not prevent their referents from being made finalizable, finalized, and then reclaimed. Weak references are most often used to implement canonicalizing mappings.

對於弱引用gc的時候一定會被釋放。

軟引用的使用

(使用系統去判斷釋放時機,而非快取演算法。)

軟引用示例

    public class SoftReferenceTest
    {

        /**
         * @param args
         */
        public static void main(String[] args)
        {
            //軟引用的利用,首先強引用構造軟引用,然後強引用放空,使用軟引用,軟引用為空時重新初始化物件,一種快取機制
            A a = new A();
            SoftReference<A> sa = new SoftReference<A>(a);
            a = null;

            System.out.println("use a --->");

            //具體使用a物件的時候利用如下程式碼
            if(sa != null)
            {
                a = (A)sa.get();
            }
            else
            {
                a = new A();
                sa = new SoftReference<A>(a);
            }

            //gc對軟引用的影響
            System.out.println("gc effect for softreference");
            System.out.println(sa.get());
            System.gc();
            System.out.println(sa.get()); //由於這裡的場景記憶體不緊張,所以不會回收

            //gc對弱引用的影響
            A b = new A();
            WeakReference<A> sb = new WeakReference<SoftReferenceTest.A>(b);
            b = null;
            System.out.println("gc effect for weakreference");
            System.out.println(sb.get());
            System.gc();
            System.out.println(sb.get());//得到的是null,上一句gc觸發垃圾回收,弱引用被釋放,呼叫finalize

        }

        public static class A
        {
            public A()
            {

            }

            @Override
            protected void finalize() throws Throwable
            {
                // TODO Auto-generated method stub
                super.finalize();
                System.out.println("finalize of A" + this.toString());
            }
        }
    }

/*
use a --->
gc effect for softreference
[email protected]
[email protected]
gc effect for weakreference
[email protected]
null
finalize of [email protected]
*/

注意,程式碼呼叫gc,對於system.gc()使得gc過程在此後一個不固定時間觸發,不一定是立即呼叫。同樣jvm不保證物件的finalize一定被呼叫,但是finalize方法只能被呼叫一次。

軟引用和引用佇列

引用佇列用於判斷軟引用是否失效以及釋放軟引用本身這個引用(強引用)。
當軟可及物件被回收之後,雖然這個SoftReference物件的get()方法返回null,但這個SoftReference物件已經不再具有存在的價值,需要一個適當的清除機制,避免大量SoftReference物件帶來的記憶體洩漏。如果在建立SoftReference物件的時候,使用了一個ReferenceQueue物件作為引數提供給SoftReference的構造方法,那麼軟引用被gc處理後,會將軟引用本身這個引用加入到referenceQueue中,通過佇列的poll方法可以查到對應物件被釋放掉的軟引用。

構造軟引用時引入引用佇列:

ReferenceQueue queue = new ReferenceQueue();
SoftReference ref=new SoftReference(aMyObject, queue);

通過引用佇列去看是否有被釋放的引用物件,此引用已經無效。

SoftReference ref = null;
while ((ref = q.poll()) != null) {
// 清除ref
}

WeakHashMap

一種hashmap,如果key不被引用,則此鍵值對被移除。

    import java.util.Map;
    import java.util.WeakHashMap;

    public class WeakHashMapDemo
    {

        private static Map<String, String> map;

        public static void main(String args[])
        {
            map = new WeakHashMap<String, String>();

            map.put(new String("Maine"), "Augusta");

            Runnable runner = new Runnable()
            {
                public void run()
                {
                    while (map.containsKey("Maine"))
                    {
                        try
                        {
                            Thread.sleep(500);
                        } catch (InterruptedException ignored)
                        {
                        }
                        System.out.println("Thread waiting");
                        System.gc();
                    }
                }
            };
            Thread t = new Thread(runner);
            t.start();
            System.out.println("Main waiting");
            try
            {
                t.join();
            } catch (InterruptedException ignored)
            {
            }
        }
    }
/**
 * output
 * Main waiting
 * Thread waiting
 */

map.put(new String(“Maine”), “Augusta”);
使用匿名引數,對於作為key的string沒有強引用指向它,根據weakhashmap的規則,gc的時候這個key對應的鍵值對被移除。
weakhashmap充分利用了weakreference的特性,使用弱引用來做鍵值。
關於weakhashmap的一段介紹

WeakHashMap is an implementation of the Map interface that stores only weak references to its keys. Storing only weak references allows a key-value pair to be garbage-collected when its key is no longer referenced outside of the WeakHashMap.

關於weakReference的一段介紹

Weak Reference − If the only references to an object are weak references, the garbage collector can reclaim the object’s memory at any time.it doesn’t have to wait until the system runs out of memory. Usually, it will be freed the next time the garbage collector runs.

參考文件

相關推薦

Java各種引用(Reference)解析

目錄 1,引用型別 2, FinalReference 2.1, Finalizer 3, SoftReference 4, WeakReference 5,

java各種引用介紹

主要講解軟引用和弱引用的概念以及引用佇列的用法,最後介紹了weakhashmap,關於自定義使用軟引用結合hashmap構建快取,可以看參考文章,以後有機會也會專門寫一篇介紹。 java中各種引用存活週期 強引用>軟引用>弱引用>

史上最全 Java 各種鎖的介紹

更多精彩原創內容請關注:JavaInterview,歡迎 star,支援鼓勵以下作者,萬分感謝。 鎖的分類介紹 樂觀鎖與悲觀鎖 鎖的一種巨集觀分類是樂觀鎖與悲觀鎖。樂觀鎖與悲觀鎖並不是特定的指哪個鎖(Java 中也沒有那個具體鎖的實現名就叫 樂觀鎖或悲觀鎖),而是在併發情況下兩種不同的策略。 樂觀鎖(Opti

理解Java引用傳遞和值傳遞

包裝類 pri ble buffer 聲明 change cnblogs padding ber 關於Java傳參時是引用傳遞還是值傳遞,一直是一個討論比較多的話題,有論壇說Java中只有值傳遞,也有些地方說引用傳遞和值傳遞都存在,比較容易讓人迷惑。關於值傳遞和引用傳遞其

java引用類型

類型 不回 告訴 oom 通過 利用 垃圾回收 對象實例 soft 一、強引用。無論什麽時候,垃圾回收器都不會回收他,若是內存不足會拋出OOM異常,也不回收強引用對象。 二、軟引用。通過類SoftReference。它的作用告訴垃圾回收器,在內存不足的時候,會被回收器回收,

JavaBigDecimal類介紹及用法

exceptio decimal body ue4 mage oat 比較運算符 mod 乘法   Java中提供了大數字(超過16位有效位)的操作類,即 java.math.BinInteger 類和 java.math.BigDecimal 類,用於高精度計算.   其

java引用類型的對象存放在哪裏

void 上下 實例變量 java body 在哪裏 運行時 () 數據 根據上下文來確定。比如void func(){ Object obj = new Object();//這個obj在函數的棧裏。}class Test{ private Object obj

Java各種集合總結(一)

分享圖片 link 抽象類 解決 集合 1.0 分享 arr 抽象 (一)集合與數組 數組:(存基本數據類型)-->存對象的一種容器,長度固定,【不適合在對象數量未知的情況下使用】 集合:(存對象,對象類型可以不一樣)-->長度可變,可在多數情況下使用。 (二)

Java引用傳遞和值傳遞

基本類型包裝類 new except pri 引用類型 otsu 靜態 數據 app   1.基本類型和引用類型在內存中的保存  Java中數據類型分為兩大類,基本類型和對象類型。相應的,變量也有兩種類型:基本類型和引用類型。  基本類型的變量保存原始值,即它代表的值就是數

關於java交叉引用的思考

實現 con 架構 ice 不能 交叉引用 關於 重復 出現問題 之前項目遇到過幾次交叉引用的問題,成片的紅線,十分壯觀... 比方說有三級 controller (c) service (s) dao (d)         A

java引用之OA現金盤平臺維護

ear 四種 管理 cep jar null test 垃圾收集 lang 從Java SE2開始,Java提供了強引用、軟引用、弱引用和虛引用四種引用類型。其目的有:1)便於垃圾收集器回收;2)方便程序 員通過代碼的方式管理對象的生命周期。 使用示例 1.強引用:OA現金

關於java的“引用”概念

ref 討論 引用 stub 前言 clas 中一 按值傳遞 基本 前言 最近在閱讀《java編程思想》一書時,對作者關於java中的”引用(句柄)“的解釋不太清楚,因此以實驗的方式來討論下java中一切皆”按值傳遞“這一說法,從而加深理解。 正文 情景一:當參數為基本數

JavaRunTime類介紹

tro 源碼 new dex notepad 拷貝 spa 瀏覽器 int Runtime 類代表著Java程序的運行時環境,每個Java程序都有一個Runtime實例,該類會被自動創建,我們可以通過Runtime.getRuntime() 方法來獲取當前程序的Runtim

JAVA各種異常總結

1.java.lang.nullpointerexception這個異常大家肯定都經常遇到,異常的解釋是"程式遇上了空指標",簡單地說就是呼叫了未經初始化的物件或者是不存在的物件,這個錯誤經常出現在建立圖片,呼叫陣列這些操作中,比如圖片未經初始化,或者圖片建立時的路徑錯誤等等。對陣列操作中出現空

Java 四種引用介紹及使用場景

強引用-FinalReference 介紹: 強引用是平常中使用最多的引用,強引用在程式記憶體不足(OOM)的時候也不會被回收,使用方式: String str = new String("str");這個str就是強引用。    可用場景: 地球人都知道,但是我講不出來。 軟引

java引用型別概念

此文章轉自:http://blog.sina.com.cn/s/blog_7fb1495b01012sfn.html 1、什麼是引用型別 引用型別(reference type)指向一個物件,不是原始值,指向物件的變數是引用變數。 在java裡面除去基本資料型別的其它型別都是引

熟悉Java String的使用,熟悉String的各種函式,Java各種變數型別

1.JDK 6和JDK 7中substring的原理及區別 substring(int beginIndex, int endIndex)方法擷取字串並返回其[beginIndex,endIndex-1]範圍內的內容。 String x = "abcdef"; x = x.substri

java 引用資料型別

 字串String  在java 中,字串不是基本資料型別,而是String 類的物件,當我們建立一個字串的時候,真的是要使用new 來呼叫String 建構函式 String str = new String();   但是如果僅僅想建立一個字串物件的話,完全可以使用字面量的方法,字面量還

java各種演算法和資料結構的使用場景

一。通用資料結構:陣列,連結串列,樹,雜湊表 通用資料結構通過關鍵字的值來儲存並查詢資料,如報表,合同,記錄,業績等資料。通用資料結構可以用速度的快慢來分類,陣列和連結串列是最慢的,樹相對較快,雜湊表是最快的。請注意,並不是最快的就一定是最好的,因為最快的結構的

java各種集合的用法和比較

一,java中各種集合的關係圖Collection       介面的介面     物件的集合  ├ List           子介面         按進入先後有序儲存   可重複  │├ LinkedList    介面實現類     連結串列     插入刪除