判断进程是否被swap需看/proc/{pid}/smaps_rollup中Swap和SwapPss字段:Swap为0表示当前无页被换出,SwapPss反映进程实际承担的交换成本;两者持续非零增长表明内存严重不足。

怎么看进程有没有被 swap 出去
关键看 Swap 和 SwapPss 这两个字段,它们直接反映该进程有多少内存页被换出到 swap 分区。
执行 cat /proc/{pid}/smaps_rollup 后,搜索这两行:
-
Swap: 0 kB—— 表示当前没有物理页被换出(注意:不等于“永远不会被换出”,只是此刻没换) -
SwapPss: 1234 kB—— 是 PSS 视角下的交换量,考虑了共享页的分摊,比Swap更贴近“这个进程实际承担的 swap 成本”
如果两者长期非零且持续增长,说明该进程正被内核频繁换入换出,是内存严重不足的信号。此时 free -h 中的 used swap 通常也接近上限。
smaps_rollup 里哪些字段和 swap 直接相关
除了 Swap 和 SwapPss,下面几个字段共同构成 swap 行为的上下文:
-
Anonymous:匿名映射页总量(如堆、栈、malloc 分配),这类页可被 swap;值越大,潜在 swap 风险越高 -
Private_Dirty:进程独占且已修改的内存,是 swap 的主要候选对象;若它高而Swap低,说明还没触发换出;若它高且Swap也在涨,说明内核已经开始回收 -
Rss和Pss持续高于MemAvailable(查/proc/meminfo)时,swap 往往已是“进行时”而非“将来时”
注意:Shmem、File 类内存一般不可 swap(除非挂载了 tmpfs 并启用了 swap backing),所以它们高不影响 swap 压力判断。
为什么不能只看 top 或 ps 的 %MEM 判断 swap 风险
ps aux 和 top 显示的 %MEM 基于 Rss,但 Rss 不区分“是否已被 swap”——它只统计当前驻留物理内存的大小。一个进程 Rss 是 500MB,Swap 是 300MB,%MEM 仍按 500MB 算,完全掩盖了其 300MB 已离线的事实。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
更危险的是:某些进程(如 JVM)会预分配大量虚拟内存(VmSize),但 Rss 很小,%MEM 看起来很低,却可能因 Anonymous 高、MemAvailable 低,一触发 GC 就瞬间推高 Swap。
所以,单靠 ps 或 top 定位 swap 问题,相当于用体温计测地震——读数稳定,不代表地壳没在滑动。
实操建议:快速筛查高 swap 风险进程
以下命令组合可一次性列出所有 Swap > 0 的进程及其关键指标:
adb shell "ps -A | awk '{print \$2}' | grep -E '^[0-9]+$' | while read pid; do \
if [ -f /proc/\$pid/smaps_rollup ]; then \
swap=\$(cat /proc/\$pid/smaps_rollup 2>/dev/null | grep '^Swap:' | awk '{print \$2}'); \
[ \"\$swap\" != \"0\" ] && name=\$(cat /proc/\$pid/comm 2>/dev/null | head -c 15) && \
pss=\$(cat /proc/\$pid/smaps_rollup 2>/dev/null | grep '^Pss:' | awk '{print \$2}') && \
echo \"PID:\$pid \$(printf \"%-15s\" \"\$name\") Swap:\$swap kB Pss:\$pss kB\"; \
fi; done | sort -k4 -nr"
要点:
- 必须用
adb root(或 root shell),否则多数进程的/proc/{pid}/smaps_rollup不可读 - 过滤掉
Swap: 0的进程,避免噪音;真正要盯的是那些Swap在几十 MB 以上、且Pss_Anon占比超 80% 的进程 - Android 上
smaps_rollup从 API 29(Android 10)才稳定支持,旧设备需 fallback 到完整smaps+awk聚合,耗时高得多
最易被忽略的一点:swap 不是“开/关”状态,而是连续谱。一个进程 Swap 从 0 → 10MB → 100MB 的过程,往往比最终值更值得监控——因为它暴露的是内存压力的演化节奏,而不是某个静态快照。

















