| 機制 | 觸發條件 | 執行主體 | 行為 | 開發者可控 |
|---|---|---|---|---|
| Low Memory (onTrimMemory / onLowMemory) | 系統記憶體壓力大,App 進程優先級較低時 | Android Framework → App 進程 | 回調 onTrimMemory(level) / onLowMemory(),App 主動釋放快取、圖片等非關鍵資源 | 是(覆寫回調釋放資源) |
| OOM Killer (Out Of Memory) | 系統可用記憶體極低,需強制殺死進程釋放記憶體 | Linux Kernel (lowmemorykiller) | 根據 oom_score_adj 評分,從高分進程開始殺死(空進程 → 後台服務 → 前台 App) | 否(只能優化記憶體降低評分) |
TRIM_MEMORY_UI_HIDDEN (UI 隱藏)、TRIM_MEMORY_RUNNING_LOW (記憶體較低)、TRIM_MEMORY_BACKGROUND (進入後台) 等。Glide.get(context).clearMemory() 等。oom_score_adj 基礎分 + 記憶體佔用比例。可查 /proc//oom_score_adj 及 oom_score。/sys/module/lowmemorykiller/parameters/minfree (頁數),對應不同 adj 等級的剩餘記憶體閾值。android:isolatedProcess 隔離高記憶體組件(如圖片處理)。
@Override
public void onTrimMemory(int level) {
super.onTrimMemory(level);
if (level >= TRIM_MEMORY_RUNNING_LOW) {
imageCache.evictAll(); // 釋放圖片快取
gsonCache.clear();
}
}
@Override
public void onLowMemory() {
super.onLowMemory();
// 最後機會釋放非關鍵資源
}
Low Memory = 禮貌通知請釋放資源;OOM = 強制執行死刑。開發者只能透過「平時節儉(優化記憶體)」+「收到通知快釋放(onTrimMemory)」來降低被 OOM Kill 風險,無法直接控制 OOM Killer。