相关名词:
关键名词:adj、minfree
此关键名词:oom_score、oom_score_adj、oom_adj
内存相关:total、free、used、lost、VSS、RSS、PSS、USS
这里不讲解adj与lmk水位相关基础知识,重点在:如果不适用google的配置策略,如何使用自定义的水位的方法。
google的策略就是根据实际内存及屏幕尺寸来计算lmk的水位,一般够用,不过很多厂商都自己配置。
最近看个问题,就是当内存不足(这个不好定义,怎么叫不足?)的时候,系统可能卡,系统可能一直再杀进程。
什么时候杀进程,杀哪些进程,和系统剩余内存的关系是如何关联的?
这个问题就是adj和lmk了,基础知识部分需要百度学习下。(主要是adj相关)
一、调试
1.看内存:
adb shell dumpsys meminfo
会打印很多,按顺序打印每个进程所占用的内存,再最尾打印总信息:
total是总内存,free是可用内存,used是使用内存,lost是系统已经使用,但是无法确定哪里使用的(total-free-used得出)。
2.看内存使用略微详细及排名:
adb shell 并su(root权限),然后procrank
3.看具体某个进程的内存使用情况:
adb shell ps
之后,看到具体进程的进程号和名字,然后:
以上具体含义,进行百度了解。
当内存使用大体情况看到以后,看下lmk的水位及adj值:
看到adj值和lmk水位是一一对应的。
这里的lmk水位需要换算一下,如26624换算成m单位:26624*4/1024 = 104M,这个是page为单位(一page一般是4k)的数字,所以到m需要换算。
也就是当剩余104M内存时,lmk会杀死906级别(adj=906 code中是:static final int CACHED_APP_MAX_ADJ = 906;)的进程来释放内存。
那么一部设备,在什么水位杀哪些类进程,这个是比较难的,可能需要进行尝试来确定,或者是根据使用场景不通来确定。
这也就是手机中有:节能、省电、游戏模式的部分原理。在游戏模式,可能杀死后台所有的进程来保证游戏的流畅性,当然还有更多的是cpu、gpu的满频等调整。
手动尝试修改lmk水位:minfree
adb shell并su,然后输入命令
cat /sys/module/lowmemorykiller/parameters