Android記憶體管理之LMK和OOM

2021-07-08 11:32:49 字數 2201 閱讀 8160

oom(out of memory)

lom(low on memory)

記憶體使用情況檢視:

procrank

dumpsys meminfo

一、lmk——low memory killer

android kernel 會定時執行一次檢查,殺死一些程序,釋放掉記憶體,採用的就是low memory killer機制。

lmk開始工作時,首先根據閾值表確定當前的警戒級數,則高於警戒級數的程序是待殺的範圍。

然後遍歷所有程序的oom_adj值,找到大於min_adj的程序,若找到多個,則把占用程序最大的程序存放在selected中。 

最關鍵的一步就是,傳送sigkill資訊,殺掉該程序。

kernel_3.10.40/drivers/staging/android/lowmemorykiller.c

static struct shrinker lowmem_shrinker = ;

static int __init lowmem_init(void)

static void __exit lowmem_exit(void)

static int lowmem_shrink(struct shrinker *s, struct shrink_control *sc)

二、oom——out of memory

如果上述各種方法(包括lmk)都無法釋放出足夠的記憶體空間,那麼當為新的程序分配應用程式時將發生 out of memory 異常,oom_killer 將盡最後的努力殺掉一些程序來釋放空間。

linux下有一種oom killer 的機制,它會在系統記憶體耗盡的情況下,啟用自己演算法有選擇性的kill 掉一些程序。

//device/mstar/common/build/mtv-xhdpi-1024-dalvik-heap.mk

dalvik.vm.heapgrowthlimit=128m

system/build.prop

dalvik.vm.heapgrowthlimit=128m

kernel_3.10.40/oom_kill.c

void oom_kill_process(struct task_struct *p, gfp_t gfp_mask, int order,

unsigned int points, unsigned long totalpages,

struct mem_cgroup *memcg, nodemask_t *nodemask,

const char *message)

三、例項說明

cat /sys/module/lowmemorykiller/parameters/adj

0,58,117,176,529,882

cat /sys/module/lowmemorykiller/parameters/minfree

3900,4500,6000,7000,10000,15000

說明:

當乙個程序的空閒儲存空間下降到15000個頁面時,oom_adj值為882或更大的程序將被kill掉;

當乙個程序的空閒儲存空間下降到10000個頁面時,oom_adj值為529或更大的程序將被kill掉;

當乙個程序的空閒儲存空間下降到7000個頁面時,oom_adj值為176或更大的程序將被kill掉;

當乙個程序的空閒儲存空間下降到6000個頁面時,oom_adj值為117或更大的程序將被kill掉;

當乙個程序的空閒儲存空間下降到4500個頁面時,oom_adj值為58或更大的程序將被kill掉;

當乙個程序的空閒儲存空間下降到3900個頁面時,oom_adj值為0或更大的程序將被kill掉。

四、修改方法

i/activitymanager( 3568): killing 17974:com.*.*.*/1000 (adj 5): kill background

這是需要應用androidmanifest.xml增加android:persistent="true";

在androidmanifest.xml檔案中對於intent-filter可以通過android:priority = "1000"這個屬性設定最高優先順序,1000是最高值。

Android記憶體管理

low memory killer android的low memory killer是在標準linux kernel的oom out of memory 基礎上修改而來的一種記憶體管理機制,當系統記憶體不足時,殺死bad程序釋放其記憶體。bad程序的選擇標準有兩個 oom adj和占用記憶體的大小...

Android 記憶體管理 Environment

environment類中提供了幾個靜態常量用於標識外部儲存的狀態,這些狀態都是string型別 media bad removal 在沒有掛載前儲存 已經被移除。media checking 正在檢查儲存 media mounted 儲存 已經掛載,並且掛載點可讀 寫。media mounted ...

聊聊Android記憶體管理

聊聊對記憶體洩漏的認識?1.延時性的記憶體洩漏2.覆蓋式記憶體洩漏3.累加式記憶體洩漏沒有用的物件無法 的現象就是記憶體洩露 記憶體洩露會導致什麼後果?1.應用可用的記憶體減少,增加了堆記憶體的壓力2.降低了應用的效能,比如會觸發更頻繁的 gc3.嚴重的時候可能會導致記憶體溢位錯誤,即 oom er...