前置知识:
oom_adj :oom_adj(即权重值)的值用来标记进程的重要程度,值越小,越重要
1.查看当前在运行的进程
ps 命令
基于api 21
USER PID PPID VSIZE RSS WCHAN PC NAME root 1 0 2936 548 c02cb2ef 0806b8f0 S /init root 2 0 0 0 c023edb3 00000000 S kthreadd root 3 2 0 0 c0244320 00000000 S ksoftirqd/0 root 4 2 0 0 c023ae80 00000000 S kworker/0:0 root 5 2 0 0 c023ae80 00000000 S kworker/0:0H root 6 2 0 0 c023ae80 00000000 S kworker/u8:0 root 7 2 0 0 c0244320 00000000 S migration/0 root 8 2 0 0 c026ffe2 00000000 S rcu_preempt root 9 2 0 0 c026ffe2 00000000 S rcu_bh root 10 2 0 0 c026ffe2 00000000 S rcu_sched root 11 2 0 0 c0244320 00000000 S migration/1 root 12 2 0 0 c0244320 00000000 S ksoftirqd/1 root 13 2 0 0 c023ae80 00000000 S kworker/1:0 root 14 2 0 0 c023ae80 00000000 S kworker/1:0H root 15 2 0 0 c0244320 00000000 S migration/2 root 16 2 0 0 c0244320 00000000 S ksoftirqd/2 root 17 2 0 0 c023ae80 00000000 S kworker/2:0 root 18 2 0 0 c023ae80 00000000 S kworker/2:0H root 19 2 0 0 c0244320 00000000 S migration/3 root 20 2 0 0 c0244320 00000000 S ksoftirqd/3 root 21 2 0 0 c023ae80 00000000 S kworker/3:0 root 22 2 0 0 c023ae80 00000000 S kworker/3:0H root 23 2 0 0 c023ac08 00000000 S khelper root 24 2 0 0 c023ae80 00000000 S kworker/u8:1 root 263 2 0 0 c023ac08 00000000 S writeback root 265 2 0 0 c023ac08 00000000 S bioset root 267 2 0 0 c023ac08 00000000 S kblockd root 362 2 0 0 c023ac08 00000000 S ata_sff root 373 2 0 0 c04e04b1 00000000 S khubd root 381 2 0 0 c023ac08 00000000 S md root 389 2 0 0 c023ac08 00000000 S cfg80211 root 390 2 0 0 c023ae80 00000000 S kworker/1:1 root 507 2 0 0 c029b2f6 00000000 S kswapd0 root 570 2 0 0 c02ea9d0 00000000 S fsnotify_mark root 589 2 0 0 c023ac08 00000000 S crypto root 609 2 0 0 c023ae80 00000000 S kworker/0:1 root 610 2 0 0 c023ae80 00000000 S kworker/2:1 root 611 2 0 0 c023ae80 00000000 S kworker/3:1 root 624 2 0 0 c023ae80 00000000 S kworker/u8:2 root 717 2 0 0 c023ac08 00000000 S iscsi_eh root 731 2 0 0 c0439c73 00000000 S scsi_eh_0 root 734 2 0 0 c0439c73 00000000 S scsi_eh_1 root 737 2 0 0 c023ae80 00000000 S kworker/u8:3 root 806 2 0 0 c023ac08 00000000 S binder root 834 2 0 0 c023ac08 00000000 S deferwq root 835 1 2928 440 c02cb2ef 0806b8f0 S /sbin/ueventd root 1155 2 0 0 c023ae80 00000000 S kworker/0:1H root 1156 2 0 0 c0347a36 00000000 S jbd2/vda-8 root 1157 2 0 0 c023ac08 00000000 S ext4-dio-unwrit root 1159 2 0 0 c0347a36 00000000 S jbd2/vdb-8 root 1160 2 0 0 c023ac08 00000000 S ext4-dio-unwrit root 1165 2 0 0 c0347a36 00000000 S jbd2/vdc-8 root 1166 2 0 0 c023ac08 00000000 S ext4-dio-unwrit logd 1167 1 16008 2292 ffffffff b7731481 S /system/bin/logd root 1168 1 4000 324 c02ed451 08095985 S /sbin/healthd root 1169 1 5820 1412 c02ed451 b7668b05 S /system/bin/lmkd system 1170 1 3844 736 c054e725 b773c7a6 S /system/bin/servicemanager root 1171 1 11460 2024 ffffffff b77116f1 S /system/bin/vold system 1172 1 90664 4072 ffffffff b7760b05 S /system/bin/surfaceflinger shell 1175 1 3980 1012 c03f0b31 b7674b36 S /system/bin/sh root 1176 1 101248 688 ffffffff 0806bdc5 S /sbin/adbd root 1177 1 23016 1544 ffffffff b76a36f1 S /system/bin/netd root 1178 1 4616 944 c0561671 b771ada3 S /system/bin/debuggerd radio 1179 1 12352 1460 ffffffff b767e6f1 S /system/bin/rild drm 1180 1 16828 3704 ffffffff b76597a6 S /system/bin/drmserver media 1181 1 133996 12036 ffffffff b77027a6 S /system/bin/mediaserver install 1183 1 3864 868 c05d4f03 b7749b36 S /system/bin/installd keystore 1184 1 7828 1988 c054e725 b76c07a6 S /system/bin/keystore root 1187 1 1217856 50224 ffffffff b76f43d5 S zygote root 1238 2 0 0 c023ae80 00000000 S kworker/2:1H root 1284 2 0 0 c02635e9 00000000 S kauditd root 1291 2 0 0 c023ae80 00000000 S kworker/3:1H root 1594 2 0 0 c023ae80 00000000 S kworker/1:1H system 1613 1187 1382064 99156 ffffffff b76f3b05 S system_server u0_a13 1943 1187 1301676 69172 ffffffff b76f3b05 S com.android.systemui media_rw 1973 1 7828 764 ffffffff b76b1b36 S /system/bin/sdcard u0_a31 2004 1187 1256756 38720 ffffffff b76f3b05 S com.android.inputmethod.latin radio 2051 1187 1266232 45580 ffffffff b76f3b05 S com.android.phone radio 2084 1187 1236352 30508 ffffffff b76f3b05 S com.android.server.telecom system 2113 1187 1244972 28748 ffffffff b76f3b05 S com.android.settings u0_a43 2131 1187 1237232 26700 ffffffff b76f3b05 S com.android.printspooler u0_a5 2159 1187 1244104 37184 ffffffff b76f3b05 S android.process.media u0_a2 2187 1187 1246832 36020 ffffffff b76f3b05 S android.process.acore u0_a8 2303 1187 1286968 70752 ffffffff b76f3b05 S com.android.launcher u0_a7 2323 1187 1399528 94508 ffffffff b76f3b05 S com.google.android.gms.persistent u0_a28 2351 1187 1246124 29280 ffffffff b76f3b05 S com.android.exchange u0_a7 2375 1187 1247684 33348 ffffffff b76f3b05 S com.google.process.gapps u0_a26 2392 1187 1255464 36596 ffffffff b76f3b05 S com.android.email u0_a7 2450 1187 1579872 101984 ffffffff b76f3b05 S com.google.android.gms u0_a36 2565 1187 1238472 29068 ffffffff b76f3b05 S com.android.music u0_a22 2589 1187 1242032 30744 ffffffff b76f3b05 S com.android.deskclock u0_a4 2685 1187 1241972 27552 ffffffff b76f3b05 S com.android.dialer system 2702 1187 1234492 25936 ffffffff b76f3b05 S com.android.keychain u0_a18 2759 1187 1249848 31140 ffffffff b76f3b05 S com.android.calendar u0_a1 2781 1187 1237824 31532 ffffffff b76f3b05 S com.android.providers.calendar u0_a9 2803 1187 1235380 25868 ffffffff b76f3b05 S com.android.managedprovisioning u0_a10 2830 1187 1248568 31756 ffffffff b76f3b05 S com.android.mms u0_a7 2965 1187 1352828 42936 ffffffff b76f3b05 S com.google.android.gms.ui u0_a7 3054 1187 1360172 47648 ffffffff b76f3b05 S com.google.android.gms.unstable root 3425 1176 3980 1028 c023517f b7627481 S /system/bin/sh
u0_a59 4264 1187 1254880 41968 ffffffff b76f3b05 S calc.superdy.ttest root 3430 3425 3980 1024 c023517f b76b2481 S sh root 3466 3430 5708 1088 00000000 b7728b36 R ps
2. 查看某个进程的优先级
cat /proc/进程id/oom_adj
例如:
cat /proc/1187/oom_adj 查看zygote进程的优先级
zygote 的 oom_adj value为-17
cat /proc/1613/oom_adj 查看system_server 进程的优先级
system_server 进程优先级为-15
cat /proc/2303/oom_adj 查看launcher进程的优先级
launcher进程优先级为0
cat /proc/4264/oom_adj 查看当前activity可见的进程的优先级
当前可见的进程ttest的进程优先级为0
3.ProcessList.java文件
ProcessList.java文件内部定义了一些进程的adj值
如下:
// OOM adjustments for processes in various states: // Adjustment used in certain places where we don't know it yet. // (Generally this is something that is going to be cached, but we // don't know the exact value in the cached range to assign yet.) static final int UNKNOWN_ADJ = 16; // This is a process only hosting activities that are not visible, // so it can be killed without any disruption. static final int CACHED_APP_MAX_ADJ = 15; static final int CACHED_APP_MIN_ADJ = 9; // The B list of SERVICE_ADJ -- these are the old and decrepit // services that aren't as shiny and interesting as the ones in the A list. static final int SERVICE_B_ADJ = 8; // This is the process of the previous application that the user was in. // This process is kept above other things, because it is very common to // switch back to the previous app. This is important both for recent // task switch (toggling between the two top recent apps) as well as normal // UI flow such as clicking on a URI in the e-mail app to view in the browser, // and then pressing back to return to e-mail. static final int PREVIOUS_APP_ADJ = 7; // This is a process holding the home application -- we want to try // avoiding killing it, even if it would normally be in the background, // because the user interacts with it so much. static final int HOME_APP_ADJ = 6; // This is a process holding an application service -- killing it will not // have much of an impact as far as the user is concerned. static final int SERVICE_ADJ = 5; // This is a process with a heavy-weight application. It is in the // background, but we want to try to avoid killing it. Value set in // system/rootdir/init.rc on startup. static final int HEAVY_WEIGHT_APP_ADJ = 4; // This is a process currently hosting a backup operation. Killing it // is not entirely fatal but is generally a bad idea. static final int BACKUP_APP_ADJ = 3; // This is a process only hosting components that are perceptible to the // user, and we really want to avoid killing them, but they are not // immediately visible. An example is background music playback. static final int PERCEPTIBLE_APP_ADJ = 2; // This is a process only hosting activities that are visible to the // user, so we'd prefer they don't disappear. static final int VISIBLE_APP_ADJ = 1; // This is the process running the current foreground app. We'd really // rather not kill it! static final int FOREGROUND_APP_ADJ = 0; // This is a process that the system or a persistent process has bound to, // and indicated it is important. static final int PERSISTENT_SERVICE_ADJ = -11; // This is a system persistent process, such as telephony. Definitely // don't want to kill it, but doing so is not completely fatal. static final int PERSISTENT_PROC_ADJ = -12; // The system process runs at the default adjustment. static final int SYSTEM_ADJ = -16;
参考:
https://www.jianshu.com/p/6201dc3a447a
https://www.jianshu.com/p/10cce92fc7b1