- 強引用(Strong Reference):JVM寧愿拋出OOM看峻,也不會讓GC回收的對象
- 軟引用(Soft Reference) :只有內(nèi)存不足時,才會被GC回收他嫡。
- 弱引用(weak Reference):在GC時番官,一旦發(fā)現(xiàn)弱引用,立即回收
- 虛引用(Phantom Reference):任何時候都可以被GC回收钢属,當(dāng)垃圾回收器準備回收一個對象時徘熔,如果發(fā)現(xiàn)它還有虛引用,就會在回收對象的內(nèi)存之前淆党,把這個虛引用加入到與之關(guān)聯(lián)的引用隊列中酷师。程序可以通過判斷引用隊列中是否存在該對象的虛引用,來了解這個對象是否將要被回收染乌∩娇祝可以用來作為GC回收Object的標(biāo)志。
image.png
注意Android中存在的差異
但是在2.3以后版本中荷憋,系統(tǒng)會優(yōu)先將SoftReference的對象提前回收掉, 即使內(nèi)存夠用台颠,其他和Java中是一樣的。所以谷歌官方建議用LruCache(least recentlly use 最少最近使用算法)。會將內(nèi)存控制在一定的大小內(nèi), 超出最大值時會自動回收, 這個最大值開發(fā)者自己定串前。其實LruCache就是用了很多的HashMap瘫里,三百多行的代碼
在開發(fā)過程中,保存對象荡碾,這時我很可以直接使用LruCache來代替谨读,Bitmap對象:
在Android開發(fā)過程中,我們常常使用HasMap保存對象坛吁,但是為了防止內(nèi)存泄漏劳殖,在保存內(nèi)存占用較大、生命周期較長的對象的時候拨脉,盡量使用LruCache代替HasMap用于保存對象哆姻。
而造成不能回收的根本原因就是:堆內(nèi)存中長生命周期的對象持有短生命周期對象的強/軟引用,盡管短生命周期對象已經(jīng)不再需要玫膀,但是因為長生命周期對象持有它的引用而導(dǎo)致不能被回收填具。