如果你想准确查看每个内存段的起始地址以及 RSS(实际驻留在物理内存中的大小,单位 KB),那么pmap -x PID就是最直接、最实用的命令。默认执行 pmap 只会列出地址和映射路径,无法判断进程到底真实占用了多少物理内存。pmap -x 的输出包含 Address、Kbytes、RSS、Dirty、Mode、Mapping 六列信息,其中 RSS 的总和通常接近进程实际使用的物理内存大小,适合快速定位堆区、数据段、匿名映射等关键内存区域。

直接用 pmap -x 查地址和物理内存占用,不要只看默认输出
不带 -x 参数的 pmap 只能显示十六进制地址和映射路径,根本无法看出具体哪一段占用了多少物理内存。排查 Linux 进程内存问题时,真正有价值的是每段内存的 RSS(驻留物理内存)和起始地址,而这些信息只有通过 pmap -x 才能完整看到。
很多人常犯的错误是直接执行 pmap 12345,然后面对一堆地址无从下手——因为默认输出不会告诉你哪些页面真正驻留在 RAM 中,也无法进一步区分哪些属于堆、哪些属于共享库数据段或匿名映射。
pmap -x输出固定六列:Address(起始虚拟地址)、Kbytes(映射总大小)、RSS(实际占用的物理内存 KB)、Dirty(已写入但尚未刷盘的页)、Mode(权限标记,如rw-p)、Mapping(映射来源)RSS总和 ≈ 进程当前实际占用的物理内存,与ps -o rss= -p的结果通常接近,但pmap -x能进一步细分到每一个内存段- 地址列(
Address)使用十六进制表示,可直接配合gdb attach,再用x/10xw 0x56442a9b7000检查对应地址中的内容
Mapping 列怎么快速判断堆区、数据段和匿名映射
Mapping 并不是简单的类型标签,而是内核记录的映射来源,因此需要结合 Mode 权限和上下文一起判断:
[heap]:表示通过brk扩展出来的堆内存区域,Mode通常为rw-p。如果这部分RSS持续上涨,往往说明malloc/free不匹配,存在堆内存泄漏风险[anon]:泛指所有没有文件 backing 的匿名映射,包括大块malloc(通过mmap分配)、线程栈、JVM DirectBuffer 等。如果多个小的[anon]区域加起来RSS很大,通常意味着 native 层内存分配失控- 带文件路径的行(如
/usr/bin/python3.10)且Mode为rw-p:一般对应 ELF 文件中的.data和.bss段,看到的RSS就是它当前实际占用的物理内存 [stack]或[stack:12345]:表示主线程栈或某个线程栈,通常RSS在 1–8MB 左右。如果这里出现明显暴涨,要重点怀疑栈溢出、递归过深或线程栈异常膨胀
为什么 /proc//smaps 比 pmap -x 更适合做精确分析
pmap -x 中的 RSS 是对各段做简单汇总,而 /proc/ 会对每个 VMA 分别统计,并把共享内存按比例摊销,这才更接近“单个进程真实内存开销”的分析依据。
- 重点看三列:
Rss(与pmap -x的 RSS 总和接近)、Pss(共享内存均摊后的结果,分析整机内存压力时非常关键)、Private_Dirty(判断泄漏最有价值的指标,持续增长通常表示进程自己在malloc后写入且没有释放) - 查看堆区:
grep -A 5 "heap" /proc/,重点观察/smaps Private_Dirty是否持续偏高 - 查看数据段:
awk '/^Name:/ && /data/ { getline; print }' /proc/,用于筛选 .data/.bss 相关内容/smaps - 注意:
smaps的行数往往非常多,可能达到上千行,不要直接用cat全量查看,最好配合grep或awk有针对性地提取需要的信息
pmap -d 并不是可用选项,别在这上面浪费排查时间
在主流 Linux 发行版中,例如 Ubuntu、CentOS、Debian,自带的 pmap 通常都不支持 -d 参数。执行 pmap -d 时,常见结果是报错 invalid option -- 'd',或者直接输出帮助信息。
- 如果你想查看“设备号与偏移量”这类更底层的信息,其实应该去看
/proc/的原始内容:第五列是/maps mj:mn(主设备号和次设备号),第六列是inode,第七列是文件路径 - 如果想确认某个内存段是不是纯匿名映射,可以使用:
cat /proc/,当设备号为/maps | awk '$5 == "00:00" && $7 == "" {print}' 00:00且没有路径时,通常就是真正的匿名映射 - 遇到需要深入分析 Linux 进程内存映射的场景,推荐的正确步骤是:
pmap -x先快速定位问题区域 →/proc/验证/smaps Private_Dirty等关键指标 → 必要时再回看/proc/检查原始权限和设备字段/maps
虚拟地址映射本身通常是固定可见的,但某个物理页是否真正驻留在 RAM 中、是否属于共享页、以及是否已经被进程写脏,都必须结合 RSS、Pss、Private_Dirty 这三项指标交叉分析。少看其中任意一项,都有可能把共享库页误判成内存泄漏来源,影响 Linux 内存问题定位的准确性。
