關於Reference的基本瞭解

Java從JDK1.2之後就將對象的引用分爲4個級別:強引用、軟引用、弱引用、虛引用。具體的概念不詳述了。

軟引用:當內存空間足夠的時候,GC就不會回收它,內存空間不足了,就會回收。

弱引用:GC工作過程中,一旦發現了弱引用對象,不管內存足夠與否,都會回收它的內存。

=>只具有弱引用的對象擁有更短暫的生命週期,可能隨時被回收。

 

強引用是使用最普遍的引用。如果一個對象具有強引用,那垃圾回收器絕不會回收它。當內存空間不足,Java虛擬機寧願拋出OutOfMemoryError錯誤,使程序異常終止,也不會靠隨意回收具有強引用的對象來解決內存不足的問題。

虛引用大家可能比較陌生,主要是指:

“虛引用”顧名思義,就是形同虛設,與其他幾種引用都不同,虛引用並不會決定對象的生命週期。如果一個對象僅持有虛引用,那麼它就和沒有任何引用一樣,在任何時候都可能被垃圾回收器回收。

虛引用主要用來跟蹤對象被垃圾回收器回收的活動。虛引用與軟引用和弱引用的一個區別在於:虛引用必須和引用隊列(ReferenceQueue)聯合使用。當垃圾回收器準備回收一個對象時,如果發現它還有虛引用,就會在回收對象的內存之前,把這個虛引用加入到與之 關聯的引用隊列中。

ReferenceQueue queue = new ReferenceQueue ();

PhantomReference pr = new PhantomReference (object, queue);

程序可以通過判斷引用隊列中是否已經加入了虛引用,來了解被引用的對象是否將要被垃圾回收。如果程序發現某個虛引用已經被加入到引用隊列,那麼就可以在所引用的對象的內存被回收之前採取必要的行動。

 

不過官方更加推薦LruCache。

 

1.圖片加載過多的話會出現OOM, 怎麼避免?

弱引用和軟引用(由於是內存不足引發的OOM,因此用軟引用),Android 3.0之後引入了Lrucache,比軟引用更高效。

2.圖片的數量非常多,有讀取SD卡的,有網絡下載的,爲了達到更加流暢:

兩層緩存,內存緩存+磁盤緩存;也就是Lrucache + DiskCache.

3.漫畫類應用由於對圖像質量要求的高,因此可以採用三層緩存。

內存+文件+網絡

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章