在Android系統中,lmkd(Low Memory Killer Daemon,低內存終止守護進程)負責監控系統的內存狀態,并在內存壓力較高時通過終止不必要的進程來釋放內存,以維持系統的穩定運行。關于lmkd為何在殺到adj(OOM Adjustment)值為100的進程時代表系統處于低內存狀態,可以從以下幾個方面進行解釋:
1. OOM Adjustment(OOM_ADJ或adj)值的意義
OOM Adjustment(OOM_ADJ或簡稱adj)值是Android系統用來評估進程優先級和重要性的一個關鍵參數。該值越小,表示進程越重要,越不應該被殺死;值越大,表示進程越不重要,越容易被殺死以釋放內存。從Android 7.0開始,ADJ值采用100、200、300等更細致的劃分,以更精確地管理進程優先級(在此之前的版本中,ADJ值采用1、2、3等較粗略的劃分)。
2. adj 100的意義
在Android系統中,adj 100通常代表了一個具有特定重要性的進程類別。具體來說,adj 100可能對應于VISIBLE_APP_ADJ或類似級別的進程,這類進程雖然對用戶可見,但并非處于最前臺或最關鍵的狀態。因此,當系統內存壓力增大到一定程度時,這些adj值較高的進程可能會成為lmkd的清理目標。
3. lmkd的工作機制
lmkd會根據系統的內存狀態和預設的策略(如基于adj值和內存使用量的閾值)來決定哪些進程需要被終止。當系統內存達到預設的低內存閾值時,lmkd會開始掃描并殺死那些adj值較高、內存占用較多的進程,以釋放內存供更關鍵的進程使用。
4. 為什么殺到adj 100代表低內存
- adj值的優先級:如前所述,adj值越大的進程越容易被殺死。因此,當lmkd開始殺死adj 100的進程時,說明系統內存已經緊張到需要犧牲一些對用戶可見但非關鍵的進程來釋放內存。
- 內存壓力的判斷:lmkd會根據系統的內存使用情況和預設的閾值來判斷是否處于低內存狀態。一旦達到或超過這些閾值,lmkd就會開始執行清理操作。
- 用戶體驗的保障:通過優先殺死adj值較高的進程,系統可以確保那些對用戶更關鍵、更重要的進程(如前臺應用、系統服務等)能夠繼續運行,從而保障用戶體驗。
綜上所述,當lmkd開始殺死adj 100的進程時,這通常意味著系統已經處于低內存狀態,并需要通過清理不必要的進程來釋放內存。這一行為是Android系統內存管理機制的重要組成部分,旨在確保系統在內存資源有限的情況下仍能夠穩定運行。