Android中四種引用以及適用場景

從 JDK1.2 版本開始忠蝗,把對象的引用分為四種級別摄咆,從而使程序能更加靈活的控制對象的生命周期誓琼。這四種級別由高到低依次為:

  1. 強引用 StrongReference
  2. 軟引用 SoftReference
  3. 弱引用 WeakReference
  4. 虛引用 PhantomReference

Android 中采用了標注與清理(Mark and Sweep)回收算法:

從”GC Roots” 集合開始晌缘,將內(nèi)存整個遍歷一次长捧,保留所有可以被 GC Roots 直接或間接引用到的對象晦闰,而剩下的對象都當作垃圾對待并回收放祟。

在 Android 中,每一個應用程序對應有一個單獨的 Dalvik 虛擬機實例呻右,而每一個 Dalvik 虛擬機的大小是固定的(如 32M跪妥,可以通過ActivityManager.getMemoryClass()獲得)。這意味著我們可以使用的內(nèi)存不是無節(jié)制的声滥。所以即使有著 GC 幫助我們回收無用內(nèi)存眉撵,還是需要在開發(fā)過程中注意對內(nèi)存的引用。否則,就會導致內(nèi)存泄露执桌。

強引用 StrongReference

強引用是使用最普遍的引用鄙皇。如果一個對象具有強引用,那垃圾回收器絕不會回收它仰挣。當內(nèi)存空間不足伴逸,Java 虛擬機寧愿拋出 OutOfMemoryError 錯誤,使程序異常終止膘壶,也不會靠隨意回收具有強引用的對象來解決內(nèi)存不足的問題错蝴。如代碼 String s=”abc” 中變量 s 就是字符串對象”abc” 的一個強引用。只要你給強引用對象 s 賦空值 null, 該對象就可以被垃圾回收器回收颓芭。因為該對象此時不再含有其他強引用顷锰。

弱引用 WeakReference

弱引用通過類 WeakReference 來表示。弱引用并不能阻止垃圾回收亡问。如果使用一個強引用的話官紫,只要該引用存在,那么被引用的對象是不能被回收的州藕。弱引用則沒有這個問題束世。在垃圾回收器運行的時候,如果對一個對象的所有引用都是弱引用的話床玻,該對象會被回收毁涉。

軟引用 SoftReference

弱引用和軟引用的區(qū)別在于:如果一個對象只具有軟引用,若內(nèi)存空間足夠锈死,垃圾回收器就不會回收它贫堰;如果內(nèi)存空間不足了,才會回收這些對象的內(nèi)存待牵。

而只具有弱引用的對象擁有更短暫的生命周期其屏。在垃圾回收器線程掃描它所管轄的內(nèi)存區(qū)域的過程中,一旦發(fā)現(xiàn)了只具有弱引用的對象缨该,不管當前內(nèi)存空間足夠與否漫玄,都會回收它的內(nèi)存。

所以從引用的強度來講: 強引用 > 軟引用 > 弱引用压彭。

虛引用 PhantomReference

一個只被虛引用持有的對象可能會在任何時候被 GC 回收。虛引用對對象的生存周期完全沒有影響渗常,也無法通過虛引用來獲取對象實例壮不,僅僅能在對象被回收時,得到一個系統(tǒng)通知(只能通過是否被加入到 ReferenceQueue 來判斷是否被 GC皱碘,這也是唯一判斷對象是否被 GC 的途徑)询一。

我們都知道,java 的 Object 類里面有個 finalize 方法,它的工作原理是這樣的:一旦垃圾回收器準備好釋放對象占用的內(nèi)存空間健蕊,將首先調用其 finalize 方法菱阵,并且在下一次垃圾回收動作發(fā)生時,才會真正回收對象占用的內(nèi)存缩功。但是晴及,問題在于,虛擬機不能保證 finalize 何時被調用嫡锌,因為 GC 的運行時間是不固定的虑稼。

使用虛引用就可以解決這個問題,虛引用主要用來跟蹤對象被垃圾回收的活動势木,主要用來實現(xiàn)比較精細的內(nèi)存使用控制蛛倦,這對于 Android 設備來說是很有意義的。比如啦桌,我們可以在確定一個 Bitmap 被回收后溯壶,再去申請另外一個 Bitmap 的內(nèi)存,通過這種方式可以使得程序所消耗的內(nèi)存維持在一個相對較低且穩(wěn)定的水平甫男。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末且改,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子查剖,更是在濱河造成了極大的恐慌钾虐,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件笋庄,死亡現(xiàn)場離奇詭異效扫,居然都是意外死亡,警方通過查閱死者的電腦和手機直砂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進店門菌仁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人静暂,你說我怎么就攤上這事济丘。” “怎么了洽蛀?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵摹迷,是天一觀的道長。 經(jīng)常有香客問我郊供,道長峡碉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任驮审,我火速辦了婚禮鲫寄,結果婚禮上吉执,老公的妹妹穿的比我還像新娘。我一直安慰自己地来,他們只是感情好戳玫,可當我...
    茶點故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著未斑,像睡著了一般咕宿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上颂碧,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天荠列,我揣著相機與錄音,去河邊找鬼载城。 笑死肌似,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的诉瓦。 我是一名探鬼主播川队,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼睬澡!你這毒婦竟也來了固额?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤煞聪,失蹤者是張志新(化名)和其女友劉穎斗躏,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體昔脯,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡啄糙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了云稚。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片隧饼。...
    茶點故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖静陈,靈堂內(nèi)的尸體忽然破棺而出燕雁,到底是詐尸還是另有隱情,我是刑警寧澤鲸拥,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布拐格,位于F島的核電站,受9級特大地震影響刑赶,放射性物質發(fā)生泄漏禁荒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一角撞、第九天 我趴在偏房一處隱蔽的房頂上張望呛伴。 院中可真熱鬧,春花似錦谒所、人聲如沸热康。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽姐军。三九已至,卻和暖如春尖淘,著一層夾襖步出監(jiān)牢的瞬間奕锌,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工村生, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留惊暴,地道東北人。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓趁桃,卻偏偏與公主長得像辽话,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子卫病,可洞房花燭夜當晚...
    茶點故事閱讀 44,969評論 2 355

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