1. 理解 oom_adj 值的核心意义
在 Android 系统中,oom_adj 是一个关键的内核参数,它直接决定了应用进程在内存不足时的存活优先级。这个值由 ActivityManagerService 动态计算,范围从 -17 到 16,数值越小表示进程优先级越高。当系统内存紧张时,Linux 内核的 OOM Killer 会根据 oom_score_adj(由 oom_adj 转换而来)选择终止优先级最低的进程。
我曾在开发一款后台服务应用时,因为不了解 oom_adj 机制导致服务频繁被系统回收。通过 adb shell 查看发现其 oom_adj 值高达 7,处于容易被杀的范围。后来通过将其改为前台服务(oom_adj=2),稳定性显著提升。这个经历让我深刻认识到掌握 oom_adj 机制的重要性。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 查看 oom_adj 值的完整方法
2.1 通过 adb 命令直接查询
最直接的方式是使用 adb shell 命令查看:
bash复制adb shell ps -A | grep <package_name> # 先获取进程ID
adb shell cat /proc/<pid>/oom_adj # 查看原始adj值
adb shell cat /proc/<pid>/oom_score_adj # 查看最终使用的adj值
这里需要注意:
- oom_adj 是 Android 自定义的优先级值(-17~16)
- oom_score_adj 是内核实际使用的值(-1000~1000)
- 两者通过公式换算:oom_score_adj = oom_adj * 1000 / 17
注意:在 Android 8.0 及以上版本,部分进程可能无法直接读取 /proc/
/oom_adj,此时应优先使用 oom_score_adj
2.2 使用 Android Studio 的 Profiler 工具
对于开发者更友好的方式是使用 Android Profiler:
- 连接设备并启动应用
- 点击 View > Tool Windows > Profiler
- 选择 Memory 面板
- 在 Live Allocation 中找到目标进程
- 查看进程详情中的 "Importance" 字段
Profiler 会直观显示进程状态:
- FOREGROUND(可见活动,adj=0)
- VISIBLE(可见但无焦点,adj=1)
- PERCEPTIBLE(可感知如后台播放音乐,adj=2)
- SERVICE(后台服务,adj=3-5)
- CACHED(缓存进程,adj=7+)
2.3 编程获取 oom_adj 值
如果需要应用内自检,可以通过反射获取:
java复制public int getOomAdjValue() {
try {
Process process = Runtime.getRuntime().exec("ps -A");
BufferedReader reader = new BufferedReader(
new InputStreamReader(process.getInputStream()));
