題目:請簡單說一下你在android開發過程中如何對內存進行優化。
分析:眾所周知,Android應用程序是運行在java虛擬機之中,垃圾回收采用的是java當中的GC機制,由系統進行整體調度,開發者無法直接干預,因此在開發過程中對內存的合理使用就顯得尤其重要。
1.對Bitmap的優化:
在Android應用中,最消耗內存的就是Bitmap的圖片資源。而在android系統中,讀取Bitmap時,分配給虛擬機中堆棧的大小只有8M,如果超出了,就會OOM(Out Of Memory)。
a>要及時回收Bitmap,當Bitmap使用完畢後,執行如下代碼:
[java]
if(bitmap && !bitmap.isRecycle()){
bitmap.recycle();
bitmap = null;
}
system.gc();
注意,最後一句system.gc();只是請求系統盡快進行垃圾回收,而不能保證系統立即做出反應。
由於生成Bitmap對象是通過調用JNI接口實現的,釋放同樣也需要調用JNI接口。所以加載Bitmap對象到內存之後是包含兩部分區域的,一個是java的部分,一個是C的部分。系統的GC機制在回收的時候只能回收java部分的內存,而不能釋放C部分的內存,C部分的內存只能通過調用recycle()接口來釋放。
那若不調用recycle()接口,是否就一定存在內存洩漏呢?也不是。當應用的進程被應用自己或者被系統殺死後,整個進程的內存就會被釋放,當然也包含C的部分。
b>捕獲異常
[html]
Bitmap bitmap = null;
try{
bitmap = BitmapFactory.decodeFile(path);
}catch(OutOfMemoryError e)
{
// do something
}
if(!bitmap)
return default_bitmap;
這樣,在發生OOM的時候,應用就不會崩潰,而是會顯示一張默認的圖片。注意在catch的地方catch的是Error,而不是Exception。
c>緩存通用的Bitmap對象
對於那種在應用中要多次重復用到的圖片,可以在內存中只保留一個副本,即可以定義成全局變量或者靜態變量。
d>壓縮圖片
2.使用軟引用和弱引用
Java將對象的引用分為四種級別,從而使程序能夠更靈活的控制對象的生命周期。四種級別從高到低分別是:強引用,軟引用,弱引用,虛引用。
a>強引用就是通常的用法,不再贅述。
b>軟引用,如果一個對象只有軟引用,那麼當內存足夠的時候,它和強引用的對象沒區別;當內存不足時,系統會將它回收掉。
[html]
private Map<String , SoftReference<Bitmap>> imageCache = new HashMap<String, SoftReference<Bitmap>>;
public void addBmToCache(String path){
Bitmap bm = BitmapFactory.decodeFile(path);
SoftReference<Bitmap> softbm = new SoftReference<Bitmap>(bm);
imageCache.put(path, softbm);
}
public Bitmap getBmByPath(String path){
SoftReference<Bitmap> softbm = imageCache.get(path);
if(softbm == null)
return null;
Bitmap bm = softbn.get();
return bm;
}
c>弱引用,如果一個對象只有弱引用,那麼在GC線程掃描過程中,一旦發現此類對象,無論內存是否足夠,這個對象都將被回收。
軟引用和弱引用的區別在於,弱引用的生命周期更短,隨時有可能被回收;軟引用只有在內存不足的時候才會被回收。
d>虛引用,形同虛設,主要是用來跟蹤內存回收情況,必須和引用隊列聯合進行使用。
由於筆者水平有限,給各面試題提供的思路或代碼難免會有錯誤,還請讀者批評指正。另外,熱忱歡迎讀者能夠提供更多、更好的面試題,本人將感激不盡。如有任何意見或建議,歡迎在評論中告知。
博主徐方磊對本博客文章享有版權。網絡轉載請注明出處http://blog.csdn.net/shishengshi。整理出版物請和作者聯系。