进程保活之oom_adj级别查询

本文介绍了Android系统中,当内存不足时如何根据oom_adj值判断进程优先级。oom_adj值越小,进程优先级越高,系统更不易杀死。通过`adb shell ps`和`cat /proc/进程id/oom_adj`可以查询进程的oom_adj值。在资源紧张时,adj值为-17的native进程会被系统保留。理解这一机制对实现进程保活至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  

  当系统的内存不足时, Android系统将根据进程优先级选择杀死一些不太重要的进程。那么进程的优先级是怎样判别的呢?对,就是这个根据进程的oom_adj值。oom_adj的值越小,进程的优先级越高。如果oom_adj的值为 NATIVE_ADJ 即为-17,那么,程序为native级别永驻内存了。

  1.获取当前连接的所有设备

在DOS下使用 adb devices命令  


上面标示有两个设备在线,一个模拟机,一个真机。

注意,这里使用的是devices 不是device 如果使用 adb device 则会打印本地安卓调试桥信息



2.选中要使用的目标 adb -s 设备名 命令

例如 adb -s emulator-5554 shell


出现root@generic_x86:/ # 即获取到模拟机的root权限。

<think>我们被要求使用ADB命令查看Android进程的实时oom_adj值。根据引用[1][2][3]可知,oom_adj是Linux内核中用于调度进程内存释放的机制,值越小优先级越高,越不容易被回收。在Android中,我们可以通过查看`/proc/<pid>/oom_score_adj`文件来获取进程oom_adj值(在较新的Android版本中,oom_adjoom_score_adj替代,但为了兼容,通常仍称为oom_adj)。注意:在Android 8.0及以上,我们通常查看`oom_score_adj`,它替代了旧的`oom_adj`,但概念类似。 步骤: 1. 获取目标进程的PID(进程ID)。 2. 通过PID查看进程的`oom_score_adj`值。 具体命令如下: ### 步骤1:获取进程列表和PID 使用以下命令列出所有进程及其PID: ```bash adb shell ps -A ``` 或者,如果想查看特定应用的进程,可以使用包名过滤,例如: ```bash adb shell ps -A | grep com.tencent.mm ``` ### 步骤2:查看指定进程oom_score_adj值 假设我们获取到目标进程的PID为`12345`,则使用以下命令: ```bash adb shell cat /proc/12345/oom_score_adj ``` ### 一步到位的命令 如果想一次性查看所有进程oom_score_adj值,可以使用以下命令: ```bash adb shell ps -A -o PID,NAME | awk '{print $1}' | xargs -I {} sh -c 'echo -n "PID {}: "; cat /proc/{}/oom_score_adj 2>/dev/null' ``` 但是,这个命令在部分Android设备上可能因为缺少awk或xargs而无法运行。因此,更通用的方法是编写一个简单的shell脚本,但通过adb shell执行多行命令较为复杂。 ### 替代方法:使用单个进程查看 我们可以先获取进程列表,然后逐个查看。例如,查看微信(包名com.tencent.mm)相关进程oom_score_adj值: ```bash adb shell "ps -A | grep com.tencent.mm | awk '{print \$2}' | while read pid; do echo \"PID: \$pid, oom_score_adj: \$(cat /proc/\$pid/oom_score_adj 2>/dev/null)\"; done" ``` 注意:在较新的Android版本中,可能需要root权限才能查看其他进程的`/proc/<pid>/oom_score_adj`文件。如果没有root权限,可能只能查看自己应用的进程。 ### 解释 - `oom_score_adj`:取值范围是-1000到1000,值越小表示进程优先级越高,越不容易被杀死。 - 常见值: - 前台应用:0 - 可见应用:100 - 次要服务:200 - 后台应用:300 - 缓存应用:400 - 系统留:-1000(系统进程) ### 示例输出 假设微信的主进程PID为12345,则命令`adb shell cat /proc/12345/oom_score_adj`的输出可能是: ``` 0 ``` 表示该进程当前是前台进程。 ### 注意事项 1. 部分设备可能因为权限问题无法查看非本用户的进程信息,此时需要root权限。 2. 在Android 8.0及以上,`oom_adj`已经被`oom_score_adj`取代,但两者作用相似,我们查看`oom_score_adj`。 ### 引用说明 根据引用[4]中的例子,他们查看了微信和QQ进程oom_adj值,其中微信的push进程显示为0(前台进程)。在Android系统中,通过这种方式可以监控进程的优先级状态。 因此,用户可以通过上述ADB命令查看实时oom_score_adj值。 §§相关问题§§ 1. 如何提升Android应用的进程优先级? 2. 在Android中,oom_score_adjoom_adj有什么区别? 3. 没有root权限如何查看应用的oom_score_adj值?</think>### 使用 ADB 查看 Android 进程实时 oom_adj 值 在 Android 系统中,`oom_adj`(Out-Of-Memory Adjustment)值决定了进程在内存不足时被系统回收的优先级。数值范围从 -17 到 16,**值越小表示优先级越高**,越不容易被系统杀死[^1][^2]。 #### 查看步骤: 1. **获取目标进程的 PID** ```bash adb shell ps -A | grep <包名或进程名> ``` 示例(查看微信进程): ```bash adb shell ps -A | grep tencent ``` 2. **查看指定进程oom_adj 值** ```bash adb shell cat /proc/<PID>/oom_score_adj ``` > **注意**:在 Android 7.0+ 中,`oom_adj` 已被 `oom_score_adj` 替代,但作用相同[^3]。 3. **批量查看所有进程(需要 root)** ```bash adb shell su -c "ps -A -o PID,NAME,COMM | while read pid name comm; do echo \"\$name (\$pid): \$(cat /proc/\$pid/oom_score_adj 2>/dev/null)\"; done" ``` #### 常见 oom_adj 值含义: | 值 | 进程类型 | 说明 | |---------|-----------------------|--------------------------| | **-17** | `NATIVE_ADJ` | Native 进程,永久驻留内存 | | **0** | `FOREGROUND_APP_ADJ` | 前台应用进程 | | **1-5** | `VISIBLE_APP_ADJ` | 可见应用进程 | | **6-7** | `PERCEPTIBLE_APP_ADJ` | 可感知进程(如后台音乐) | | **8-15**| `CACHED_APP_MIN_ADJ` | 缓存进程(优先回收) | #### 实际案例(参考引用[4]): ```bash # 微信推送服务进程 adb shell cat /proc/12420/oom_score_adj # 输出:0 (前台进程优先级) # QQ 下载服务进程 adb shell cat /proc/12474/oom_score_adj # 输出:16 (低优先级缓存进程) ``` > **权限说明**: > - 查看系统进程需要 root 权限 > - 普通应用只能查看自身进程oom_adj 值 > - Android 8.0+ 对 oom_adj 访问有更严格限制[^3] #### 实用技巧: 1. **实时监控变化**: ```bash adb shell watch -n 1 "cat /proc/<PID>/oom_score_adj" ``` 2. **结合内存状态查看**: ```bash adb shell dumpsys activity processes | grep -E "Proc #|oom_adj" ``` 3. **进程优先级排序**: ```bash adb shell ps -A -o PID,NAME,ADJ --sort=ADJ ``` --- ### 相关问题 1. **如何提升 Android 应用的进程优先级?** `通过修改 oom_adj 值(需系统权限),或使用前台服务提升优先级[^1][^3]` 2. **oom_adj进程冻结(freeze)机制有何关联?** `低优先级(高 oom_adj 值)的进程会优先被冻结或回收` 3. **Android 如何动态调整进程oom_adj 值?** `系统根据应用状态(前台/后台)自动调整,开发者也可通过特定 API 干预[^3]` [^1]: oom_adj是Linux内核中一个用于调度进程内存释放的机制 [^2]: 进程oom_adj级别查询 [^3]: 通过ProcessList.java中的setOomAdj方法去调整进程的优先级 [^4]: 查下企鹅的三个进程oom_adj
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值