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
<span style="font-size:14px;"><span style="font-size:14px;"><span style="font-size:14px;">static struct shrinker lowmem_shrinker = {
.shrink = lowmem_shrink,
.seeks = DEFAULT_SEEKS * 16
};
static int __init lowmem_init(void)
{
register_shrinker(&lowmem_shrinker);
return 0;
}
static void __exit lowmem_exit(void)
{
unregister_shrinker(&lowmem_shrinker);
}
static int lowmem_shrink(struct shrinker *s, struct shrink_control *sc)
{
send_sig(SIGKILL, selected, 0);
}</span></span></span>
二、OOM——out of memory
如果上述各種方法(包括LMK)都無法釋放出足夠的內存空間,那麼當爲新的進程分配應用程序時將發生 Out of Memory 異常,OOM_killer 將盡最後的努力殺掉一些進程來釋放空間。
//////////////////
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
<span style="font-size:14px;"><span style="font-size:14px;"><span style="font-size:14px;">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)
{
do_send_sig_info(SIGKILL, SEND_SIG_FORCED, p, true);
}</span></span></span>
三、實例說明
cat /sys/module/lowmemorykiller/parameters/adj
<span style="font-size:14px;"><span style="font-size:14px;"><span style="font-size:14px;">0,58,117,176,529,882</span></span></span>
cat /sys/module/lowmemorykiller/parameters/minfree
<span style="font-size:14px;"><span style="font-size:14px;"><span style="font-size:14px;">3900,4500,6000,7000,10000,15000</span></span></span>
說明:
當一個進程的空閒存儲空間下降到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掉。
四、修改方法
<span style="font-size:14px;">I/ActivityManager( 3568): Killing 17974:com.*.*.*/1000 (adj 5): kill background</span>
這是需要應用AndroidManifest.xml增加android:persistent="true";
在AndroidManifest.xml文件中對於intent-filter可以通過android:priority = "1000"這個屬性設置最高優先級,1000是最高值。