Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android統就如何管理自己內存的?

Android統就如何管理自己內存的?

編輯:關於Android編程



本文來自http://blog.csdn.net/liuxian13183/ ,引用必須注明出處!


機緣巧合寫下這篇博客,作為個人工作經驗的總結,不足之處,隨後補上。

安卓是基於Linux2.6內核的操開源作系統,安卓比Linux更智能在於:進程結束後,安卓會把程序(並非進程)保留在內存中,直到內存不夠再釋放。

在安卓看來,內存不能空著,留程序緩存在後台不會占用CPU-只保留運行狀態,二次打開更加快速-不用再次打開界面資源;所以安卓的內存在於有效利用。

系統會設置一個阈值,當系統內存低於此值時,便會按優先級來回收,一直達到另外一個穩定的阈值。優先級由低到高依次如下:

前台進程:如當前界面運行的“憤怒的小鳥”、“網易新聞”等

可見進程:如界面的Widget、輸入法和時鐘等

次要服務:如聯系人緩存、電話、Gmail內部存儲等

後台進程:按下Home鍵後的“前台進程”

Content Provider

空進程:程序退出後留下的狀態,如記錄程序的歷史信息,以便下次加載提高速度


可以給這些進程設置內存oom_adj,值越高,回收越快,也可以手動設置。推薦軟件:Auto Memory Manager

硬性回收一般是錯誤程序的回收。

程序退出並不殺死,也會觸發Android低內存管理機制(Low Memory);另外程序申請內存大於虛擬機所剩內存,會觸發Android內存不足管理機制(Out of Memory)。

AMS(Activity Manager Service)運行在獨立的虛擬機上,啟動時即注冊一個OOM Killer,當系統內存低時Linux內核會通知OOM Killer,然後根據AMS定義的級別來強制殺死應用程序。優先級如上所述。

殺死機制:優先退出優先級低的,或同優先級但內存占用大的程序


經驗示例1:

Bitmapbitmap = null;

try {

// 實例化Bitmap

bitmap= BitmapFactory.decodeFile(path);

}catch(OutOfMemoryError e) {

}

if(bitmap == null) {

// 如果實例化失敗返回默認的Bitmap對象

return defaultBitmapMap;

}

  這裡對初始化Bitmap對象過程中可能發生的OutOfMemory異常進行了捕獲,由於OOM是error而非Exception,防止內存溢出錯誤不能捕獲。


經驗示例2:

BitmapFactory.Optionsopts = new BitmapFactory.Options();

// 設置inJustDecodeBounds為true

opts.inJustDecodeBounds= true;

// 使用decodeFile方法得到圖片的寬和高

BitmapFactory.decodeFile(path,opts);

// 打印出圖片的寬和高

Log.d("example",opts.outWidth + "," + opts.outHeight);

系統API提示:需要縮小圖片時,通過此方法可以獲得圖片的寬和高,不會給圖片分配內存,然後再設置opts.inJustDecodeBounds為false即可。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved