Android性能提升之強引用昌腰、軟引用膀跌、弱引用捅伤、虛引用使用

強引用
Java中的引用,類似于C++的指針祠汇。通過引用熄诡,可以對堆中的對象進行操作凰浮。在某個函數(shù)中苇本,當創(chuàng)建了一個對象菜拓,該對象被分配在堆中,通過這個對象的引用才能對這個對象進行操作俺夕。



假設以上代碼是在方法內(nèi)運行的劝贸,那么局部變量str將被分配在椃∮猓空間上疙剑,而對象StringBuffer實例,被分配在堆空間中嚼蚀。局部變量str指向StringBuffer實例所在的堆空間管挟,通過str可以操作該實例,那么str就是StringBuffer的引用导帝。



此時您单,運行一個賦值語句:

那么荞雏,str所指向的對象也將被str1所指向凤优,同時在局部棧空間上會分配空間存放str1變量俺驶。此時挖垛,該StringBuffer實例就有兩個引用秉颗。對引用的”==”操作用于表示兩個操作數(shù)所指向的堆空間地址是否相同蚕甥,不表示兩個操作數(shù)所指向的對象是否相等栋荸。

強引用特點:
強引用可以直接訪問目標對象晌块。
強引用所指向的對象在任何時候都不會被系統(tǒng)回收。JVM寧愿拋出OOM異常呼伸,也不會回收強引用所指向的對象钝尸。
強引用可能導致內(nèi)存泄露珍促。

軟引用

軟引用是除了強引用外,最強的引用類型娇斩⊙妫可以通過java.lang.ref.SoftReference使用軟引用芒帕。一個持有軟引用的對象,不會被JVM很快回收,JVM會根據(jù)當前堆的使用情況來判斷何時回收基矮。當堆的使用率臨近閾值時,才會回收軟引用的對象本砰。 看下我工作中使用到軟引用的場景钢悲,加載一個1080x1920分辨率的圖,約900多K, 對于我們來說还棱,這個圖已是非常大了。



1.首先通過BitmapFactory.decodeStream構(gòu)造一個大圖bitmap
2.然后把這個bitmap轉(zhuǎn)成Drawble類型办铡,構(gòu)成強引用琳要。
3.接著使用SoftReference構(gòu)造這個drawable對象的軟引用drawables.
4.最后通過軟引用的get()方法,取得drawable對象實例的強引用童叠,發(fā)現(xiàn)對象被未回收课幕。在GC在內(nèi)存充足的情況下撰豺,不會回收軟引用對象。

在實際中亩歹,一起請求很多相關圖片凡橱,從網(wǎng)絡,這時就會請求非常多的內(nèi)存空間顾稀,導致內(nèi)存吃緊坝撑,系統(tǒng)開始會GC巡李。這次GC后,drawables.get()不再返回Drawable對象殊橙,而是返回null,這時屏幕上背景圖不顯示叠纹,說明在系統(tǒng)內(nèi)存緊張的情況下誉察,軟引用被回收制肮。

使用軟引用以后,在OutOfMemory異常發(fā)生之前综液,這些緩存的圖片資源的內(nèi)存空間可以被釋放掉的儒飒,從而避免內(nèi)存達到上限桩了,避免Crash發(fā)生。

需要注意的是蕉扮,在垃圾回收器對這個Java對象回收前颗圣,SoftReference類所提供的get方法會返回Java對象的強引用在岂,一旦垃圾線程回收該Java對象之后,get方法將返回null易茬。所以在獲取軟引用對象的代碼中及老,一定要判斷是否為null,以免出現(xiàn)NullPointerException異常導致應用崩潰骄恶。

到底什么時候使用軟引用岸蜗,什么時候使用弱引用呢?

個人認為叠蝇,如果只是想避免OutOfMemory異常的發(fā)生,則可以使用軟引用。如果對于應用的性能更在意悔捶,想盡快回收一些占用內(nèi)存比較大的對象铃慷,則可以使用弱引用。
還有就是可以根據(jù)對象是否經(jīng)常使用來判斷蜕该。如果該對象可能會經(jīng)常使用的犁柜,就盡量用軟引用。如果該對象不被使用的可能性更大些堂淡,就可以用弱引用。
另外绢淀,和弱引用功能類似的是WeakHashMap萤悴。WeakHashMap對于一個給定的key,其映射的存在并不阻止垃圾回收器對該鍵的回收皆的,回收以后覆履,其條目從映射中有效地移除。WeakHashMap使用ReferenceQueue實現(xiàn)的這種機制费薄。

弱引用

弱引用是一種比軟引用較弱的引用類型硝全。在系統(tǒng)GC時,只要發(fā)現(xiàn)弱引用楞抡,不管系統(tǒng)堆空間是否足夠伟众,都會將對象進行回收。但是召廷,由于垃圾回收器的線程通常優(yōu)先級很低凳厢,因此,并一不定能很快的發(fā)現(xiàn)持有弱引用的對象柱恤。這種情況下数初,弱引用對象可以存在較長的一段時間。一旦一個弱引用對象被垃圾回收器回收梗顺,便會加入到一個注冊引用隊列中泡孩。 看一個工作中實例:播放器的播放Panel,是一個View寺谤,就是在視頻播放時仑鸥,可以show、hide, 也可以拖拽進度條之類变屁,還有上面的音量眼俊,亮度調(diào)節(jié)等。這樣一個view粟关,我們用弱引用疮胖,因為在視頻播放過程中,不論硬解還是軟解,都將占用大量內(nèi)存澎灸。保證視頻的渲染效果院塞。
在VideoControllerView.java 有如下一段代碼:



在GC之前,弱引用對象并未被垃圾回收器發(fā)現(xiàn)性昭,因此通過mView.get()方法可以取得對應的強引用拦止。但是只要進行垃圾回收,弱引用對象一旦被發(fā)現(xiàn)糜颠,便會立即被回收汹族,并加入注冊引用隊列中。此時其兴,再次通過mView.get()方法取得強引用就會失敗顶瞒。
注意:軟引用,弱引用都非常適合來保存那些可有可無的緩存數(shù)據(jù)忌警。如果這樣做搁拙,當系統(tǒng)內(nèi)存不足時,這些緩存數(shù)據(jù)會被回收法绵,不會導致內(nèi)存溢出箕速。而當內(nèi)存資源充足時,這些緩存數(shù)據(jù)又可以存在相當長的時間朋譬。

虛引用

虛引用是所有引用類型中最弱的一個盐茎。一個持有虛引用的對象,和沒有引用幾乎是一樣的徙赢,隨時都可能被垃圾回收器回收字柠。當試圖通過虛引用的get()方法取得強引用時,總是會失敗狡赐。并且窑业,虛引用必須和引用隊列一起使用,它的作用在于跟蹤垃圾回收過程枕屉。
當垃圾回收器準備回收一個對象時常柄,如果發(fā)現(xiàn)它還有虛引用,就會在垃圾回收后搀擂,銷毀這個對象西潘,獎這個虛引用加入引用隊列。
實際中幾乎沒用哨颂,暫不介紹喷市。

最后一張圖總結(jié)下:


這里寫圖片描述

原文地址:http://blog.csdn.net/hejjunlin/article/details/52637333

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市威恼,隨后出現(xiàn)的幾起案子品姓,更是在濱河造成了極大的恐慌寝并,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,888評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缭黔,死亡現(xiàn)場離奇詭異食茎,居然都是意外死亡,警方通過查閱死者的電腦和手機馏谨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來附迷,“玉大人惧互,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 168,386評論 0 360
  • 文/不壞的土叔 我叫張陵翎卓,是天一觀的道長甩卓。 經(jīng)常有香客問我,道長姑裂,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,726評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮匆赃,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘今缚。我一直安慰自己算柳,他們只是感情好,可當我...
    茶點故事閱讀 68,729評論 6 397
  • 文/花漫 我一把揭開白布姓言。 她就那樣靜靜地躺著瞬项,像睡著了一般。 火紅的嫁衣襯著肌膚如雪何荚。 梳的紋絲不亂的頭發(fā)上囱淋,一...
    開封第一講書人閱讀 52,337評論 1 310
  • 那天,我揣著相機與錄音餐塘,去河邊找鬼妥衣。 笑死,一個胖子當著我的面吹牛唠倦,可吹牛的內(nèi)容都是我干的称鳞。 我是一名探鬼主播,決...
    沈念sama閱讀 40,902評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼稠鼻,長吁一口氣:“原來是場噩夢啊……” “哼冈止!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起候齿,我...
    開封第一講書人閱讀 39,807評論 0 276
  • 序言:老撾萬榮一對情侶失蹤熙暴,失蹤者是張志新(化名)和其女友劉穎闺属,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體周霉,經(jīng)...
    沈念sama閱讀 46,349評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡掂器,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,439評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了俱箱。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片国瓮。...
    茶點故事閱讀 40,567評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖狞谱,靈堂內(nèi)的尸體忽然破棺而出乃摹,到底是詐尸還是另有隱情,我是刑警寧澤跟衅,帶...
    沈念sama閱讀 36,242評論 5 350
  • 正文 年R本政府宣布孵睬,位于F島的核電站,受9級特大地震影響伶跷,放射性物質(zhì)發(fā)生泄漏掰读。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,933評論 3 334
  • 文/蒙蒙 一叭莫、第九天 我趴在偏房一處隱蔽的房頂上張望蹈集。 院中可真熱鬧,春花似錦食寡、人聲如沸雾狈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽善榛。三九已至,卻和暖如春呻畸,著一層夾襖步出監(jiān)牢的瞬間移盆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評論 1 272
  • 我被黑心中介騙來泰國打工伤为, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留咒循,地道東北人。 一個月前我還...
    沈念sama閱讀 48,995評論 3 377
  • 正文 我出身青樓绞愚,卻偏偏與公主長得像叙甸,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子位衩,可洞房花燭夜當晚...
    茶點故事閱讀 45,585評論 2 359

推薦閱讀更多精彩內(nèi)容