0 前言
基于 android 7.1.1 源码,分析和总结 Process 相关知识!
1 dumpsys meminfo –oom
dumpsys meminfo
可以来看系统的内存使用情况,这里我们重点关注:Total PSS by OOM adjustment
:
默认的 dumpsys meminfo
是出了可以看 Total PSS by OOM adjustment
,还可以看 Total PSS by process
等等详细的信息,这里我们只关注第一种,这里有一个很方便的指令:
adb shell dumpsys meminfo --oom
下面是该指令的输出:
1 | Applications Memory Usage (in Kilobytes): |
我们可以看到,这部分,系统是根据进程的 adj
将其分类,然后根据不同的分类,显示出了不同类别进程的内存使用情况!
这里我们关心的是 adb shell dumpsys meminfo --oom
是如何归类不同类型的进程的!
2 dumpApplicationMemoryUsage
adb shell dumpsys meminfo --oom
最终会调用 dumpApplicationMemoryUsage
函数,这里我们重点关注和 --oom
相关的逻辑:
这里我们先来看几个和该指令相关的常量;
1 | static final int[] DUMP_MEM_OOM_ADJ = new int[] { |
DUMP_MEM_OOM_ADJ
中封装的是 oom adj
,DUMP_MEM_OOM_LABEL
中封装的是 lebal
,这个看命令输出,很容易猜到是什么意思!
下面我们来重点分析方法!!
1 | final void dumpApplicationMemoryUsage(FileDescriptor fd, |
上面的逻辑是和 Total PSS by OOM adjustment
相关的!
1 | ArrayList<ProcessRecord> collectProcesses(PrintWriter pw, int start, boolean allPkgs, |
其实,我们可以看出 adb shell dumpsys meminfo --oom
没有传入任何参数,所以返回的就是 mLruProcesses
的拷贝!
3 总结
分析了 adb shell dumpsys meminfo –oom 方法的执行流程,我们来总结下,进程的分类:
序号 | 进程 Label | 起始 oom adj 值 |
---|---|---|
1 |
Native |
ProcessList.NATIVE_ADJ : -1000 |
2 |
System |
ProcessList.SYSTEM_ADJ : -900 |
3 |
Persistent |
ProcessList.PERSISTENT_PROC_ADJ : -800 |
4 |
Persistent Service |
ProcessList.PERSISTENT_SERVICE_ADJ : -700 |
5 |
Foreground |
ProcessList.FOREGROUND_APP_ADJ : 0 |
6 |
Visible |
ProcessList.VISIBLE_APP_ADJ : 100 |
7 |
Perceptible |
ProcessList.PERCEPTIBLE_APP_ADJ : 200 |
8 |
Backup |
ProcessList.BACKUP_APP_ADJ : 300 |
9 |
Heavy Weight |
ProcessList.HEAVY_WEIGHT_APP_ADJ : 400 |
10 |
A Services |
ProcessList.SERVICE_ADJ : 500 |
11 |
Home |
ProcessList.HOME_APP_ADJ : 600 |
12 |
Previous |
ProcessList.PREVIOUS_APP_ADJ : 700 |
13 |
B Services |
ProcessList.SERVICE_B_ADJ : 800 |
14 |
Cached |
ProcessList.CACHED_APP_MIN_ADJ : 900 |