pmap -d 无效,正确方式是用 pmap -x <PID> 查看 RSS 值定位 rw-p 映射行(非 [heap]/[stack]/[anon])以获数据段真实物理占用。

pmap -d 并不是一个标准或被广泛支持的 pmap 选项。Linux 主流发行版(如 Ubuntu、CentOS、Debian)中的 pmap 不提供 -d 参数,尝试执行 pmap -d <PID> 通常会报错:invalid option -- 'd' 或直接显示用法帮助。
你可能混淆了以下几种情况:
-
pmap -x:扩展模式,含 RSS(真实驻留物理内存)、Dirty、Kbytes 等,是查看各段物理占用详情的正确方式; -
pmap -XX:更底层的详细模式(依赖内核配置CONFIG_PROC_PAGE_MONITOR),可显示页类型(anon/file/shared)、huge page 使用等,但不叫-d; - 某些老旧文档或定制化工具中曾出现过非标准
-d(如“device mode”),但现代 procps-ng 版本(pmap 所属包)已移除或从未实现该选项; -
pmap -q是合法的(quiet 模式),pmap -V查版本,但-d无定义。
✅ 正确查看数据段(Data Segment)真实物理占用的方法
Linux 进程的“数据段”(data segment)在 pmap 输出中并不单独标记为 [data],它通常融合在以下两类区域中:
-
[heap]:运行时动态分配的全局/静态数据(如malloc、new后未释放的部分); -
可执行文件映射的
.data和.bss区域:出现在pmap第一行或紧随其后的主映射行,Mapping 列显示为二进制路径(如/usr/bin/python3.10),Mode 为rw-p(可读写、私有),这类区域即包含初始化/未初始化的数据段。
要确认其真实物理占用(即当前驻留在 RAM 中的字节数),必须使用:
pmap -x <PID>
然后关注满足以下条件的行:
- Mode 含
rw-p(排除只读的r--p代码段和只执行的r-xp); - Mapping 不为空,且不是
[heap]/[stack]/[anon]; - RSS 值即为该段当前占用的真实物理内存(KB)。
例如:
000056442a9b7000 1248 1120 128 rw-p 0000000000002000 08:01 123456 /usr/bin/myapp
→ 这一行就包含了 .data 和 .bss,RSS=1120 KB 是它实际占的物理内存。
? 快速定位与验证技巧
-
查看主映射(通常是第一行非
[anon]的rw-p行):pmap -x <PID> | awk '$4 ~ /rw-p/ && $6 != "[heap]" && $6 != "[stack]" && $6 != "[anon]" {print; exit}' -
统计所有
rw-p非匿名段的 RSS 总和(近似数据段物理占用):pmap -x <PID> | awk '$4 ~ /rw-p/ && $6 !~ /^\[.*\]$/ {sum += $3} END {print "Data-seg RSS ≈", sum, "KB"}' -
对比
/proc/<PID>/maps原始信息(权威来源):grep -E "^[0-9a-f]+-[0-9a-f]+ .*rw-p" /proc/<PID>/maps
再结合
/proc/<PID>/smaps中对应 VMA 的Rss:字段,可交叉验证。
⚠️ 注意事项
- 数据段大小 ≠ RSS:
.data/.bss可能很大(如全局数组声明为 100MB),但若未访问,RSS 可能为 0(按需分页); -
pmap -x最后一行的totalRSS 是所有段 RSS 之和,但它包含堆、栈、共享库私有页等,不能直接当作“数据段”值; - 共享库中的
.data(如libc.so.6的全局变量)属于共享内存,其 RSS 在多个进程里重复统计,不代表独占资源。
不复杂但容易忽略。


















