㈠ Android 內存溢出和內存泄漏的區別
內存溢出是指當對象的內存佔用已經超出分配內存的空間大小,這時未經處理的異常就會拋出。比如常見的內存溢出情況有:bitmap過大;引用沒釋放;資源對象沒關閉
如圖,這是常見的bitma對象的溢出,顯示像素過高或圖片尺寸遠遠大於顯示空間的尺寸時,通常都要將其縮放,減小佔用內存。
內存泄漏(memory
leak)
有些對象只有有限的生命周期。當它們的任務完成之後,它們將被垃圾回收。如果在對象的生命周期本該結束的時候,這個對象還被一系列的引用,這就會導致內存泄漏。隨著泄漏的累積,app將消耗完內存。
比如,在Activity.onDestroy()被調用之後,view樹以及相關的bitmap都應該被垃圾回收。如果一個正在運行的後台線程繼續持有這個Activity的引用,那麼相關的內存將不會被回收,這最終將導致OutOfMemoryError崩潰。
memory
leak會最終會導致out
of
memory!
如圖,這是使用MAT工具查找內存泄漏的結果,例子是
handle
延時發送
message
而在關閉
activity
後
context
被銷毀所引發的泄漏,這是作為目的性的測試所以問題比較容易找到,在實際開發中內存泄漏不易察覺並難以找到,當泄漏累積到一定程度是會引發
OOM
的。