當 Android 應用程序退出時,並不清理其所占用的內存,Linux 內核進程也相應的繼續存在,所謂“退出但不關閉”。從而使得用戶調用程序時能夠在第一時間得到響應。
當系統內存不足時,系統將激活內存回收過程。為了不因內存回收影響用戶體驗(如殺死當前的活動進程),
Android 基於進程中運行的組件及其狀態規定了默認的五個回收優先級:
IMPORTANCE_FOREGROUND:
IMPORTANCE_VISIBLE:
IMPORTANCE_SERVICE:
IMPORTANCE_BACKGROUND:
IMPORTANCE_EMPTY:
這幾種優先級的回收順序是 Empty process、Background process、Service process、Visible process、Foreground process。
防止內存溢出 1.明確調用System.gc();2.圖片處理完成后回收內存。 請在調用BitMap進行圖片處理后進行內存回收。 bitmap.recycle(); 這樣會把剛剛用過的圖片占用的內存釋放。3.圖片處理時指定大小。
1. 在Android平台上,長期保持一些資源的引用,造成一些內存不能釋放,帶來的內存泄露問題很多。比如:Context(下文中提到的Activity都是Context),在一些你需要保持你的首個類對象狀態,並且把狀態傳入其他類對象中時,這樣消除掉首個類對象之前,你必須先把接收類對象釋放掉。需要注意一點的是:因為在Java或者Android內存機制中,頂點的結點釋放前必須保證其他對象沒有調用才能被系統GC回收釋放。
綜上所述,要避免內存泄露,主要要遵循以下幾點:
第一:不要為Context長期保存引用(要引用Context就要使得引用對象和它本身的生命周期保持一致)。
第二:如果要使用到Context,盡量使用ApplicationContext去代替Context,因為ApplicationContext的生命周期較長,引用情況下不會造成內存泄露問題
第三:在你不控制對象的生命周期的情況下避免在你的Activity中使用static變量。盡量使用WeakReference去代替一個static。
第四:垃圾回收器並不保證能准確回收內存,這樣在使用自己需要的內容時,主要生命周期和及時釋放掉不需要的對象。盡量在Activity的生命周期結束時,在onDestroy中把我們做引用的其他對象做釋放,比如:cursor.close()。