pmap命令用于查看进程内存映射,核心选项包括-x(扩展格式,含rss/pss)、-d(设备格式)、-q(静默模式)和-a low,high(限制地址范围),其数据源自/proc/pid/maps,主要用于调试与运维中的内存分析。

pmap -A 不是标准选项,Linux pmap 命令**没有 -A 选项**。你看到的可能是误记、文档笔误,或混淆了其他工具(比如 perf 的地址范围参数)。真实可用的范围限制选项是 -A low,high(注意是大写 A,且必须带逗号分隔的两个十六进制地址)。
确认 pmap 是否支持 -A 选项
运行 pmap -h 或 pmap --help,你会看到类似输出:
-A, --range <low>,<high> limit output to given address range</high></low>
关键点:
-
-A后必须跟low,high两个十六进制地址(如0000555555554000,0000555555590000),不能单独使用 - 它不用于“对比”,只用于裁剪单次输出的地址区间
- 它不记录时间戳、不保存快照、不计算差值——
pmap本身不具备对比能力
真正可行的内存布局变化对比方法
要观察进程启动初期 vs 运行后的内存变化,得靠外部组合操作。核心思路是:**定时采样 + 差异提取 + 关键字段聚焦**。
- 用
ps或pidof拿到 PID 后,立即执行一次pmap -x $PID > pmap_init.log - 等进程稳定运行(比如 30 秒后),再执行
pmap -x $PID > pmap_later.log - 用
diff对比两文件,但直接 diff 全量输出噪音太大;应先提取关键列:
例如只比对 [heap]、[anon] 和共享库的 RSS 变化:
awk '$NF ~ /^\[heap\]$/ || $NF ~ /^\[anon\]$/ || $NF ~ /\.so\.|\.so$/ {print $NF, $3}' pmap_init.log | sort > init_rss.txt
awk '$NF ~ /^\[heap\]$/ || $NF ~ /^\[anon\]$/ || $NF ~ /\.so\.|\.so$/ {print $NF, $3}' pmap_later.log | sort > later_rss.txt
diff init_rss.txt later_rss.txt
这样能快速定位哪些区域 RSS 增长了——比如 [heap] 从 20480 变成 45056 KB,就值得怀疑是否泄漏。
为什么不能只看 Kbytes 或 VSZ?
虚拟内存大小(Kbytes 列)增长不等于实际内存压力上升:
-
brk扩展堆时,Kbytes增加但物理页可能未分配(lazy allocation) -
mmap(MAP_ANONYMOUS)分配大块内存,Kbytes猛增,但 RSS 为 0 直到首次写入 - 共享库路径重复出现(如多个
libc.so.6映射段),Kbytes累加会虚高,而RSS或PSS才反映真实占用
所以对比时务必盯住 RSS(或更准的 PSS,需 pmap -x 或 /proc/$PID/smaps)。
真正的难点不在命令拼写,而在解读:同一块 [anon] 区域反复出现,可能只是线程栈;[heap] 缓慢增长但伴随大量 free() 调用,未必是泄漏——得结合应用逻辑和分配模式判断。











