pmap 命令详解
更新时间:2026-09-17。「一个命令一个文档」系列,属于性能观测与调试族。当 free/top 告诉你某进程吃内存,pmap 进一步回答"地址空间里具体哪一段在吃"。
pmap 读 /proc/<pid>/maps(加 -x/-XX 读 smaps),列出进程每段虚拟内存映射及其驻留/脏页。
一、常用法
bash
pmap 1234 # 列出全部映射:起始地址 大小 权限 映射来源
pmap -x 1234 # 扩展:RSS(驻留) Dirty(脏页) Mapping,排内存最常用
pmap -XX 1234 # 更详细(Pss/Referenced/AnonHugePages 等)
pmap -x 1234 | tail -1 # 只看 total 汇总
pmap -c 1234 # 适合脚本解析| 列 | 含义 |
|---|---|
| Address/Kbytes | 映射起始地址 / 虚拟大小 |
| RSS | 实际驻留物理内存(真正占用) |
| Dirty | 被改写过的页(匿名脏页是堆/栈数据) |
| Mode | 权限 rwxp/r-xp(x 可执行) |
| Mapping | [anon]匿名(堆/栈)、[stack]、.so库、映射文件路径 |
二、怎么判断内存花在哪
- 大量
[anon]且 Dirty 高:堆上分配(malloc/new、Java 堆、Go heap),是业务对象;持续增长且不回落,结合 内存泄漏排查。 - 映射的大文件 .so / 数据文件 RSS 高:文件映射,多为共享/可回收,不必恐慌;多进程共享库的 RSS 会在各进程重复记账,要看真实占用用 PSS(
pmap -XX或smem -P)。 - 单段异常大(如几十 GB 虚拟但 RSS 小):虚拟地址预留(JVM/arena/mmap 保留),虚拟大不等于占物理内存。
[stack]、线程栈每段约 8MB 虚拟,线程多时虚拟量可观但 RSS 按需分配(见 ulimit -s)。- 重复出现很多 64MB 段:glibc malloc arena 多线程碎片特征,可调
MALLOC_ARENA_MAX。
三、与 /proc/smaps、smem、free 的关系
pmap是/proc/<pid>/smaps的可读封装;想看 PSS(按共享比例分摊)用smem(见 free 深度)。- pmap 是某一时刻快照,判断是否泄漏应多次采样对比 RSS/匿名段增长曲线,配合
pmap+top -p+ 语言层堆工具。
bash
pmap -x 1234 | sort -k3 -n | tail # 按 RSS 找最大段相关命令
系统级内存用 free/vmstat,按进程/内核缓存见 slabtop,按 USS/PSS 用 smem,OOM 见 OOM 排查 FAQ。
总结
pmap -x 把进程地址空间拆成一段段映射,给出每段 RSS/Dirty/权限/来源:匿名+脏页高多半是堆上业务对象(警惕泄漏),.so/文件映射多为共享可回收(看真实分摊用 PSS/smem),虚拟大而 RSS 小常是预留不占物理内存;它是 smaps 的可读快照,排内存时用来回答"哪个映射段在吃内存",需多次采样才能区分缓存与泄漏。