Basicconcepts
shrink: 针对slab分配器的缓存释放(释放就是回收)
reclaim: 针对buddy system的匿名页面释放
KSM: kernel samepage merging
zRam: zram是Linux内核的一个模块,之前被称为“compcache”。zram通过在RAM内的压缩块设备上分页,直到必须使用硬盘上的交换空间,以避免在磁盘上进行分页,从而提高性能;zram acts as swap disk. Pages swapped to this disk are compressed and stored inmemory itself. Compressing pages and keeping them in RAM virtually increasesits capacity. This allows more applications to fit in given amount of memory
swapd:内核模块swapd来具体进行swap操作
LMK: Android内核的一种通过杀进程来清理内存的机制,和Linux OOM机制类似;主要依据AMS维护的OOM_ADJ变量来判决kill哪个进程
Android-speedupzram
基于zram的内存回收优化方案思路,在适当的时机(CPU进idle)模仿kswapd的操作告知zram来腾出“可以交换出”的内存以增加当前空闲内存的容量。类似于加强版的kswapd,灵活地增加页面回收的强度和时机,最终用到内核中的zram机制。注:标准内核的回收管理机制根据页面活跃程度,来决定哪些页面需要被释放
Debuggingswap
Steps of enlarge swap space
From: ref:http://blog.csdn.net/xiaotuni/article/details/5417144
第一:查看当前空间大小:
free -m
total used free shared buffers cached
Mem: 1002 977 24 0 25 638
-/+ buffers/cache: 313 688
Swap: 991 0 991
第二:进入root用户 输入sudo -i 然后输入密码,就可以了。
第三:用户在根目录下创建一个目录
mkdir /swap
第四:进入swap目录;
cd /swap
第五:输入要创建交换分区命令然后回车;
dd if=/dev/zeroof=swapfile bs=1024 count=1029000
可以看到如下内容:
记录了1029000+0的读入
记录了1029000+0的写出
1053696000字节(1.1GB)已复制,69.0168 秒,15.3 MB/秒
可以用ls-lh 可以看到一个文件。
-rw-r--r-- 1 root root1005M 2010-01-02 14:35 swapfile
第六:输入命令 mkswapswapfile 可以看到下面内容:
mkswap: swapfile:warning: don't erase bootbits sectors
on whole disk. Use -fto force.
Setting up swapspaceversion 1, size = 1028996 KiB
no label,UUID=82eda1f8-f20a-4ca0-ba21-a4bdce5b765a
第七:挂载交换分区:swapon swapfile
如 果想卸载的话输入:swapoffswapfile
第八:再查看空间大小:free -m
total used free shared buffers cached
Mem: 1002 980 21 0 13 738
-/+ buffers/cache: 229 773
Swap: 1899 0 1899
Checking swap
cat /proc/swaps
/proc/sys/vm/swappiness
explanation: in Documentation/sysctl/vm.txt
688 This control is used to define how aggressive the kernel willswap
689 memory pages. Highervalues will increase agressiveness, lower values
690 decrease the amount of swap.
692 The default value is 60.
SK: max value is 100
other parameter of /proc/sys/vm/* should be checked out in Documentation/sysctl/vm.txt
Disable autorun of backgroud APP
分类:开机时启动和开机后被kill再自启
原理:前者调用option manager提供的函数,类似于api,很容易控制开机自启动;后者framework有提供FORCE_STOP_PACKAGES的函数,第三方管理软件通过监控后台程序的自启事件,来强制杀掉进程,达到禁止自启;内置的自启管理可以修改F/W代码
AMS Kill-process action enhancement
For Android5.0 customized ActivityManagement
frameworks/base/services/core/java/com/android/server/am/ProcessList.java
frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
NOTE: AMS(activity manager service)inupdateOomAdjLocked(), APP adj数值为-16 ~ 15, 数值越小进程越重要,0为foreground,复数一般为系统进程,9-15为hidden/enpty的APP,1-8为Previous/Per/service/luncher(HOME),进程的分类请参考宏定义,例如HOME_APP_ADJ,PREVIOUS_APP_ADJ,SERVICE_B_ADJ,FOREGROUND_APP_ADJ等等;kill process action is directly invoke SYSTEM_CALL kill in JNI code.(android_os_Process_sendSignal)(ProcessRecord.java kill())
Key points: (1) Dynamic adjust threshold or formula with main factorADJ’s values for kill processes, like hiddenAPPLimit, etc. (2) tracking usage ofapplication to evaluate process priority when deciding kill them or give themenough free memory to run