Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> [Android面試題-4] Android內存優化

[Android面試題-4] Android內存優化

編輯:關於Android編程

題目:請簡單說一下你在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。整理出版物請和作者聯系。
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved