這篇開始要進入到 Android 在使用記憶體上的效能優化。在記憶體效能篇,我們將依序來介紹跟記憶體效能有關的議題:
現在我們就從 Android 的記憶體管理來開始介紹。在 Android 系統中,當我們產生了一個物件,就會在 Heap 中配置一塊記憶體來處理,當一個物件不再使用時,就會進行GC (Garbage Collection )垃圾回收機制來將資源釋放。而當一個物件已經不再被使用,卻無法被回收時,我們稱為 Memory leak 記憶體洩漏。當 Memory leak 越來越多,就代表被占用無法回收的記憶體越多,最後就可能會造成 OOM(Out of memory),也就是記憶體不足。
記憶體在任何環境都是非常寶貴的資源,在行動裝置上更是如此。在 Android 手機不是只有我們的 App 正在執行,還有其他的背景 App、桌面 App、系統服務等。為了維持手機可以正常的運作,Android 會限制每個 App 的記憶體使用。當 App 使用達到了上限,就可能會收到 OOM。
如果想知道目前記憶體的使用狀況,可以透過 ActivityManager.MemoryInfo()
查看記憶體的狀況,也能直接使用MemoryInfo.lowMemory
來取得目前是否處於低記憶體資源狀況。
if (getAvailableMemory().lowMemory) {
//是否處於低記憶體資源狀況
}
println("availableMemory:${getAvailableMemory().availMem}")
println("totalMemory:${getAvailableMemory().totalMem}")
private fun getAvailableMemory(): ActivityManager.MemoryInfo {
val activityManager = getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
return ActivityManager.MemoryInfo().also { memoryInfo ->
activityManager.getMemoryInfo(memoryInfo)
}
}
當我們關閉一個 App (進到背景模式) 時,系統不會馬上把 App 從記憶體中移除,而是將其留在記憶體中,方便使用者可以快速切換回這些 App。當記憶體資源不足時,系統就會依照如下列表的順序來決定先終止哪些程序。
所以我們在「從背景處理優化效能」就有介紹,如何選擇正確的背景服務,因為這會影響在記憶體不足時,被終止的優先順序。
下一篇我們就從 OOM 來開始一步步針對記憶體使用來優化吧。