ps aux --sort=-%mem 显示 %mem(内存占比)、rss(实际驻留物理内存,kb)、vsz(虚拟内存总量,kb)三个核心指标,适合快速定位高内存占用进程,但无法区分堆、栈、共享库或匿名映射等内存类型;要解析这800mb rss由哪些部分构成,必须用pmap -x查看各内存段的size、rss和dirty,并重点分析[heap]、[stack]、[anon]及共享库路径对应行。

ps aux --sort=-%mem 能看到什么内存指标
它只显示三个核心内存字段:%MEM(物理内存占比)、RSS(Resident Set Size,单位 KB,即实际驻留物理内存)、VSZ(Virtual Size,虚拟内存总量)。这些是快照式统计,适合快速定位“谁吃得多”,但无法区分内存类型——比如你看到某个进程 RSS=800MB,它可能是堆分配、mmap 映射的文件、共享库代码段,还是匿名页(如 Java DirectByteBuffer),ps 一概不告诉你。
pmap -x 是唯一能拆解内存构成的命令
想搞清这 800MB 到底由哪些部分组成,必须用 pmap -x。不加 -x 只输出地址和映射文件名,看不到字节数,等于白跑。
-
pmap -x 1234输出每行含size(VMA 总大小)、RSS(该段实际驻留物理内存)、dirty(脏页大小) - 重点关注标记为
[heap]、[stack]、[anon]、/lib/x86_64-linux-gnu/libc.so.6这类区域的RSS值 - 最后一行的
mapped: XXXK和rss: YYYK是全进程汇总,但注意:这个rss总和通常比ps的RSS高,因为线程栈、共享内存段在每个 VMA 都重复计入
/proc//smaps 比 pmap 更细,但需手动聚合
/proc/<pid>/smaps</pid> 是内核提供的原始内存分类视图,字段粒度最细,比如能单独看到 AnonPages、Mapped、Shmem、SwapPss 等。但它不直接给出总和,得自己算:
Python Linux版 为 Python.org 官方提供的 Python 3.14.6 Linux/Unix 源码包,适合在Linux/Unix环境中安装、运行 Python 代码并学习函数、模块和脚本开发。
-
grep -i "rss\|anon\|shmem" /proc/1234/smaps | awk '{sum += $2} END {print sum}'—— 粗略估算实际物理占用 -
awk '/^Rss:/ {sum += $2} END {print sum}' /proc/1234/smaps—— 等价于pmap -x最后一行的rss - 关键区别:
smaps里Pss(Proportional Set Size)会按共享比例折算,更适合评估单个进程真实内存开销;而RSS不去重,容易高估
别用 smem 或 top 当分类依据
smem 虽标榜“内存分类统计”,但它底层仍基于 /proc/*/smaps,且默认对共享内存做 PSS 折算——这对比较进程间真实开销有用,但如果你想看“某进程到底加载了多少 .so、占了多少堆”,它反而模糊了边界。而 top 的 RES 就是 RSS,和 ps 的 RSS 同源,同样不分类。
真正要回答“内存占用分类”,只有两条路:用 pmap -x 看粗粒度段分布,或用 cat /proc/<pid>/smaps</pid> 手动挑字段——前者快,后者准,但都绕不开手动解读。没有一键命令能自动告诉你“堆占 400MB、共享库占 300MB、mmap 文件占 100MB”。










