Android 系统将尽量长时间地保持应用进程,但为了新建进程或运行更重要的进程,需要清除旧进程来回收内存。
为了确定保留或终止哪些进程,系统会对进程进行分类。 需要时,系统会首先消除重要性最低的进程,然后是清除重要性稍低一级的进程,依此类推,以回收系统资源。
https://developer.android.google.cn/guide/components/processes-and-threads.html?hl=zh-cn
Low Memory Killer
系统出于体验和性能上的考虑,app在退到后台时系统并不会真正的kill掉这个进程,而是将其缓存起来。打开的应用越多,后台缓存的进程也越多。
在系统内存不足的情况下,系统开始依据自身的一套进程回收机制来判断要kill掉哪些进程,以腾出内存来供给需要的app, 这套杀进程回收内存的机制就叫 Low Memory Killer。
cat /sys/module/lowmemorykiller/parameters/minfree
通过该命令可以查看内存阈值
image.png
内存阈值在不同的手机上不一样,一旦低于该值,Android便开始按顺序关闭进程. 因此Android开始结束优先级最低的空进程,即当可用内存小于180MB(46080)(这些数字的单位是page. 1 page = 4 kb)
- 18432–前台进程
- 23040–可见进程
- 27648–服务进程
- 32256–后台进程
- 36864–contentProvider
- 46080–空进程
oom_adj
进程的优先级通过进程的adj值来反映,它是linux内核分配给每个系统进程的一个值,进程回收机制根据这个值来决定是否进行回收。adj的值越小,进程的优先级越高。
可以通过以下命令可以看到当前进程的adj值。(需要[root]权限)
cat /proc/进程id/oom_adj
image.png
image.png
image.png
adj越大,占用内存越多会被最先kill掉,所以保活就成了降低oom_adj的值,以及如何使得我们应用占的内存最少.
image.png
网友评论