本文章主要從軟引用和弱引用的角度探討Bitmap的內存優化。 java
Java從JDK1.2以後就將對象的引用分爲4個級別:強引用、軟引用、弱引用、虛引用。具體的概念不詳述了。 緩存
軟引用:當內存空間足夠的時候,GC就不會回收它,內存空間不足了,就會回收。 優化
弱引用:GC工做過程當中,一旦發現了弱引用對象,無論內存足夠與否,都會回收它的內存。 spa
因此,從上述能夠看出,軟引用和弱引用的根本區別在於:只具備弱引用的對象擁有更短暫的生命週期,可能隨時被回收。 code
當緩存大量的Bitmap時,比較容易形成OOM,因此能夠考慮使用軟引用技術來避免這個問題的發生。 對象
//首先定義一個HashMap,保存軟引用對象 private Map<string, SoftReference<Bitmap>> imageCache = new HashMap<String, SoftReference<Bitmap>>(); //保存Bitmap的軟引用到HashMap public void addBitmapToCache(String path) { //強引用的Bitmap對象 Bitmap bitmap = BitmapFactory.decodeFile(path); //軟引用的Bitmap對象 SoftReference<Bitmap> softBitmap = new SoftReference<Bitmap>(bitmap); //添加該對象到map中使其緩存 imageCache.add(path, softBitmap); } //獲取緩存對象 public Bitmap getBitmapByPath(String path) { //從緩存中取軟引用的Bitmap對象 SoftReference<Bitmap> softBitmap = imageCache.get(path); //判斷是否存在軟引用 if(softBitmap == null) { return null; } //取出Bitmap對象,若是內存不足Bitmap被回收,將取得空 Bitmap bitmap = softBitmap.get(); return bitmap; }
使用軟引用以後,在OOM異常發生以前,這些緩存的圖片資源空間都會被釋放掉,從而能夠避免程序由於OOM而Crash。 生命週期
何時使用軟引用,何時使用弱引用? 圖片
建議:若是隻想避免OOM,則使用軟引用;若是該對象常常被使用,則使用軟引用;若是想盡快回收一些佔用內存比較大的對象,則使用弱引用; 內存