1. 程式人生 > >Android 強、軟、弱、虛引用

Android 強、軟、弱、虛引用

  1.Android引用之強引用(StrongReference)。

      啥是強引用?舉個例子,我們平時new 的物件,就都是強引用。如: String s =new String(),這就是一個強引用,那麼強引用有啥特點呢?

  • 強引用物件,也就是new 出來的那種,可以直接訪問目標物件。
  • 強引用物件,任何時候都不會被系統回收,jvm寧願丟擲outofmemory.也不會回收強引用所指向的物件,也就是說強引用會導致我們常說的記憶體溢位,比如:強引用在引用物件null時會導致記憶體洩漏。這裡注意區分記憶體溢位和記憶體洩露的區別。

  2.Android引用之軟引用(SoftReference).

 什麼是軟引用呢? 上程式碼:

 private void softReferenceMethod(){
        String str =new String("abc");
        SoftReference<String> softReference =new SoftReference<>(str);
        str=null;
        //呼叫gc回收
        System.gc();
        Log.e(TAG, "softReferenceMethod:----------- "+softReference);
    }

      使用軟引用引用的物件只有在程式發生oom異常前才會回收,也就是說如果記憶體充足永遠不會被回收,只有在記憶體不足時才會回收,很好的避免oom,適合做快取。

 那麼如何回收引用物件為空的SoftReference物件呢?

通常情況下,我們會配合ReferenceQueue一起使用,如果引用物件被GC回收,那麼SoftReference物件會被列入ReferenceQueue。也就是說,ReferenceQueue中儲存的物件是Reference物件,而且是已經失去了它所軟引用的物件的Reference物件,ReferenceQueue中有一個poll方法。當我們呼叫當我們呼叫它的poll()方法的時候,如果這個佇列中不是空佇列,那麼將返回佇列前面的那個Reference物件。那就好說了,如果我們知道此SoftReference物件還不為空,我們把她清空不就好了嗎?

       

結果:

 3.Android引用之弱引用(WeakReference).

       弱引用–>隨時可能會被垃圾回收器回收,不一定要等到虛擬機器記憶體不足時才強制回收

使用:

private void weakReferenceMethod(){
    String str =new String("abc");
    WeakReference<String> weakReference =new WeakReference(str);
    str=null;
    //呼叫gc回收
    System.gc();
    Log.e(TAG, "softReferenceMethod:----------- "+str);
}

 實戰: 大家在專案中都經常使用Handler吧,我們今天就用WeakReference來優化一下,避免記憶體洩漏。程式碼如下:

        先普及一下:當一個android主執行緒被建立的時候,同時會有一個Looper物件被建立,而這個Looper物件會實現一個MessageQueue(訊息佇列),當我們建立一個handler物件時,就是從這個訊息佇列中放入和取出訊息,每當我們通過handler將一個msg放入訊息佇列時,這個msg就會持有一個handler物件的引用。

       之所以記憶體洩漏,大多是因為非靜態內部類或匿名內部類,預設持有外部類的引用,也就是我們的Handller預設持有MainActivity的引用。那如果activity被finish.這個msg在被取出來之前,這msg會繼續存活,但是這個msg持有handler的引用,而handler在Activity中建立,會持有Activity的引用,因而當Activity結束後,Activity物件並不能夠被gc回收,因而出現記憶體洩漏。但靜態內部類不會持有外部類的引用。所以我們把MyHandller定義為靜態內部類避免引用Activity,但這樣的問題是:之前可以直接使用Activity中的方法,現在不持有外部Activity的引用,也就沒辦法直接通過方法名呼叫了。看程式碼,我們是這樣解決的:

  MyHandler myHandler;
    WeakReference mWeakReference;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //softReferenceMethod();
        //weakReferenceMethod();
        //初始化操作
        mWeakReference=new WeakReference(MainActivity.this);
        myHandler=new MyHandler(mWeakReference);
        myHandler.sendEmptyMessage(0x111);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //為了保險起見,清空所有訊息佇列
        myHandler.removeCallbacksAndMessages(null);
        mWeakReference=null;
    }

 Handler部分程式碼:

 private static class MyHandler extends Handler{
        MainActivity mainActivity;
        public MyHandler(WeakReference<MainActivity> mainActivityWeakReference) {
            //通過有參構造獲取弱引用物件,進而獲取引用物件
            mainActivity=mainActivityWeakReference.get();
        }
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what ){
              case 0x111 :
                  //執行具體Activity中的方法
                  mainActivity.doSomething();
                  break;
            }
        }
    }

那麼我們什麼時候用軟引用,什麼時候用弱引用呢,因為弱引用隨時可能被回收,而軟引用當記憶體不足時才考慮被回收。所以如果你的軟引用物件用完之後不會再次重複使用,存在的時間短,想要提高效能,儘快被回收就考慮使用弱引用,否則軟引用。兩者都能很好的避免oom的產生。

 4.Android引用之虛引用(PhantonReference).

      

    虛引用是所有引用型別中最弱的一個。一個持有虛引用的物件,和沒有引用幾乎是一樣的,隨時都可能被垃圾回收器回收。當試圖通過虛引用的get()方法取得強引用時,總是會失敗。並且,虛引用必須和引用佇列一起使用,它的作用在於跟蹤垃圾回收過程。 當垃圾回收器準備回收一個物件時,如果發現它還有虛引用,就會在垃圾回收後,銷燬這個物件,將這個虛引用加入引用佇列,開發中,沒怎麼多用過。

相關推薦

java中的引用(及利用引用實現快取記憶體)

在java中引用的型別一共有四種,分別是:強引用,軟引用,弱引用和虛引用。 那麼他們各自的定義是什麼呢? 1.強引用(StrongReference): 強引用是使用最普通的應用。如果一個物件具有強引用,那麼gc絕不會回收它。當記憶體空間不足,java虛擬

Java物件的引用原理+結合ReferenceQueue物件構造Java物件的快取記憶體器

轉自:http://blog.csdn.net/lyfi01/article/details/6415726 1.Java物件的強、軟、弱和虛引用 在JDK 1.2以前的版本中,若一個物件不被任何變數引用,那麼程式就無法再使用這個物件。也就是說,只有物件處於可觸及(re

Java引用及GC Root——記憶體優化(一)

你也可以檢視我的其他同類文章,也會讓你有一定的收貨! 記憶體優化 記憶體優化的兩個主要方向: 記憶體洩露:已經沒有使用的物件,GC Root 還對其保持強引用,導致GC無法回收。 記憶體抖動:頻繁的建立物件,導致 GC 頻率較高,導致應用的卡頓

java中引用應用

   首先,我們看一個僱員資訊查詢系統的例項。我們將使用一個Java語言實現的僱員資訊查詢系統查詢儲存在磁碟檔案或者資料庫中的僱員人事檔案資訊。作為一個使用者,我們完全有可能需要回頭去檢視幾分鐘甚至幾秒鐘前檢視過的僱員檔案資訊(同樣,我們在瀏覽WEB頁面的時候也經常會使用“後退”按鈕)。這時我們通常會有兩種程

Java物件的引用

⑴強引用(StrongReference) 強引用是使用最普遍的引用。如果一個物件具有強引用,那垃圾回收器絕不會回收它。當記憶體空間不足,Java虛擬機器寧願丟擲OutOfMemoryError錯誤,使程式異常終止,也不會靠隨意回收具有強引用的物件來解決記憶體不足的問題。

詳解Java中物件的引用的區別

你知道Java中引用有幾種寫法嗎?逃~     對於大部分的物件而言,程式裡會有一個引用變數來引用該物件,這是最常見的引用方法。除此之外,java.lang.ref包下還提供了3個類:SoftReference、WeakReference和PhantomRe

linux學習(九)set_uidset_gidstick_bit鏈接硬鏈接

private char 就是 bug spec deb date scrip usr 一、set_uid set_uid其實是一種特殊權限,我們看一個文件: [root@iZ25lzba47vZ ~]# ls -l /usr/bin/passwd -rwsr-xr-x.

【單鏡頭反光相機】影調反差光比寬容度;光質(硬光光)硬調調高調低調中間調

部分 彩色 clas 模糊 光源 fff class 中間 blank 影調: 對攝影作品而言,“影調”,又稱為照片的基調或調子。指畫面的明暗層次、虛實對比和色彩的色相明暗等之間的關系。通過這些關系,使欣賞者感到光的流動與變化。 攝影畫面中的線條、形狀、色彩等元素是由影

為什麽結構化編程面向對象編程件工程架構設計最後沒有成為件領域的銀彈

電子郵件 軟件質量 80年 說明 設計原則 世界 程序員 計算機基礎知識 bject 為什麽結構化編程、面向對象編程、軟件工程、架構設計最後沒有成為軟件領域的銀彈? 從計算機語言開始講,一步一步的概述和講解,最終會有一個結論,大家往後看,即可明白。 1.機器語言(1940年

Android效能提升之引用引用引用引用使用

背景:收到公眾投稿,《從面試題中看Java的Reference(引用)》,分析的很不錯,總感覺少了實際的例子和應用場景。於是結合自己工作中場景,小總結一下。看下Agenda如下: 強引用 軟引用 弱引用 什麼時候使用軟引用,什麼時候使用弱引用? 虛引用 一、強引用

Android 引用引用引用引用

1、強引用(StrongReference)           強引用是使用最普遍的引用。如果一個物件具有強引用,那垃圾回收器絕不會回收它。如下: ? 1 Object o=new Object();  

android的四種物件引用級別:引用

android中的強引用,弱引用,軟引用,虛引用。代表了android中的物件引用級別,也即代表了java的垃圾回收機制,看可以簡單理解為記憶體釋放。 1、強引用:強引用是使用最普遍的引用。如果一個物件具有強引用,那垃圾回收器絕不會回收它。當記憶體空間不足,Java虛擬機器

Android 引用

  1.Android引用之強引用(StrongReference)。       啥是強引用?舉個例子,我們平時new 的物件,就都是強引用。如: String s =new String(),這就是一個強引用,那麼強引用有啥特點呢? 強引用物件,也就是new 出來的那

android中四大引用的區別,引用引用引用引用

強引用:使用的內容不可被回收,直到出現out of memory錯誤,android中沒有任何關鍵字指定這種強引用。 軟引用:         如果一個物件只具有軟引用,那麼如果記憶體空間足夠,垃圾回收器就不會回收它;如果記憶體空間不足了,就會回收這些物件的記憶體。只要垃圾

引用引用引用引用

enc 存在 bject 永遠 足夠 列表 設置 系統通知 內存溢出 概念我們希望能描述這樣一類對象:在內存空間還足夠時,則能保留在內存之中;如果內存空間在進行垃圾收集後還是非常緊張,則可以拋棄這些對象。在JDK 1.2之後,Java對引用的概念進行了擴充,將引用分為強引用

java 談談引用引用(Strong Reference)引用(Soft Reference)引用(Weak Reference)引用(Phantom Reference))

內存 enc ID 足夠 phantom 強引用 進行 溢出 tom 簡單談談引用(摘自java虛擬機第二版 ) 署名:wander 一、四種引用   在JDK 1.2之後,Java對引用的概念進行了擴充,將引用分為強引用(Strong Reference)、軟

Java基礎篇 - 引用引用引用引用

splay 查看 tla 之前 for 應用 幹貨 程序 策略 前言 Java執行GC判斷對象是否存活有兩種方式其中一種是引用計數。 引用計數:Java堆中每一個對象都有一個引用計數屬性,引用每新增1次計數加1,引用每釋放1次計數減1。 在JDK 1.2以前的版本中,若

Android開發優化之的引用引用引用的使用

本文轉載至:http://www.jianshu.com/p/8488079a939b 引言 早在JDK1.2,Java就把物件的引用分為四種級別,從而使程式能更加靈活的控制物件的生命週期。這四種級別由高到低依次為:強引用、軟引用、弱引用和虛引用。 但是平時我們的程式碼中似乎很

Java中的四種引用型別(

為什麼需要不同的引用型別 從Java1.2開始,JVM開發團隊發現,單一的強引用型別,無法很好的管理物件在JVM裡面的生命週期,垃圾回收策略過於簡單,無法適用絕大多數場景。為了更好的管理物件的記憶體,更好的進行垃圾回收,JVM團隊擴充套件了引用型別,從最早的強引用型別增加到強、軟、弱、虛四個引用

Java 引用引用引用引用

參考來源:http://www.cnblogs.com/dolphin0520/p/3784171.html  感謝原作者的分享!!! 以下內容是本人在看完之後按照自己的理解複述的,僅作為學習記錄,欲知詳解請點選上面的網址。 1.強引用 示例:Object object=new