pmap 是 Linux 中查看进程虚拟内存映射的核心工具,基于 /proc/PID/maps 输出地址、大小、权限及映射来源;需用准确 PID(如 pgrep 或 systemctl 获取),-x 参数显示 RSS/Dirty 用于诊断内存泄漏与碎片化,-d 显示设备与 inode 辅助溯源。

在 Linux 系统中,pmap 是查看进程虚拟内存映射最直接的命令工具。它不分析物理内存分布,而是清晰展示进程地址空间中每个内存段的起始地址、大小、权限和映射来源——这些信息全部来自 /proc/PID/maps,是理解程序内存布局的基础。
获取目标进程 PID
必须先拿到准确的数字 PID,不能传进程名:
- 查前台运行的 Python 应用:
pgrep -f "myapp.py"(比ps aux | grep更干净,自动过滤自身) - 查 systemd 服务主进程:
systemctl show --property MainPID nginx.service | cut -d'=' -f2 - 查多个同名进程时,结合
ps -eo pid,comm,args --sort=-vsz | head -10按虚拟内存大小排序,快速定位大户
基础用法:pmap PID
不加参数时输出简洁四列:虚拟地址(Address)、大小(Kbytes)、权限(Mode)、映射名称(Mapping):
-
[heap]表示堆区,通常随 malloc/realloc 动态增长 -
[stack]是主线程栈,大小固定(一般 8MB),但线程栈会单独列出 -
[anon]标识匿名映射(如 mmap(MAP_ANONYMOUS) 或大块 malloc),无对应文件 - 路径如
/lib/x86_64-linux-gnu/libc-2.31.so表示共享库映射,注意同一库可能被多个进程共用
关键分析:pmap -x PID
加 -x 才能看到真正有用的诊断字段:Kbytes(总大小)、RSS(常驻物理页数)、Dirty(已修改未写回的页数):
- RSS 高但 Kbytes 不高 → 可能存在大量脏页未释放,或内存碎片化严重
- [anon] 段 RSS 持续增长而应用逻辑无明显分配 → 倾向于内存泄漏线索
- 多个小 [anon] 区域密集出现 → 可能是频繁 malloc/free 导致的 heap fragmentation
- 权限为
rw-p的大块区域若长期 RSS 接近 Kbytes,需检查是否缓存未及时清理
配合其他信息交叉验证
pmap 本身不提供实时物理页归属,但可与内核接口联动:
- 看更细粒度统计:直接读
/proc/PID/smaps,其中 Pss(Proportional Set Size)比 RSS 更公平反映进程真实内存开销 - 确认映射来源设备与 inode:
pmap -d PID会显示 Device(主次设备号)和 Inode,区分文件映射 vs 匿名映射 - 发现可疑区域后,用
gdb -p PID结合 Address 列定位具体代码位置(如info proc mappings)


















