进程相关知识梳理

进程保活与拉活

进程的一些常识

  • 系统出于体验和性能上的考虑,app在退到后台时系统并不会真正的kill掉这个进程,而是将其缓存起来。
  • 打开的应用越多,后台缓存的进程也越多。
  • 在系统内存不足的情况下,系统开始依据自身的一套进程回收机制来判断要kill掉哪些进程,以腾出内存来供给需要的app, 这套杀进程回收内存的机制就叫 Low Memory Killer。

Low Memory Killer

  • 每一个进程都有一个oom_adj值,进程的oom_adj值由ActivityManagerService根据运行在进程里面的组件的状态来计算
  • 进程的oom_adj值取值范围为[-16,15], oom_adj值越小,就不容易被杀死
  • 内存紧张时,基于oom_adj值来决定是否要回收一个进程

进程的优先级

官方说明

进程 优先级
前台进程 关键
可见进程
服务进程
后台进程
空进程

何时杀死进程

内存阈值在不同的手机上不一样,一旦低于该值,Android便会杀死对应优先级的进程。执行命令 cat /sys/module/lowmemorykiller/parameters/minfree,可以看到6个不同的阈值。(内存阈值大小不同手机可能会不一样)

  • 18432对应前台进程,23040对应可见进程,27648对应服务进程,32256对应后台进程,46080对应空进程。第5个值36864为ContentProvider。
  • 阈值的单位是4KB,所以计算方法为:46080*4/1024=180MB
  • 当可用内存小于180MB(46080),就杀死空进程。其他阈值类似,到了各自限定的阈值,对应级别的进程就会被杀死。
内存阈值

通过oom_adj 值,判断进程的优先级,不同手机的oom_adj值可能不一样。
通过命令行 cat /proc/3199/oom_adj 查看oom_adj值。
(3199为进程pid值,显示0即可判断为前台进程)

查看oom_adj值

各种进程对应的oom_adj值

进程oom_adj值

你可能感兴趣的:(进程相关知识梳理)