pmap 是一个 Linux/Unix 系统下的命令行工具,用于报告进程的内存映射情况,即进程地址空间中的各个内存段(如代码段、数据段、共享库、堆、栈等)的起始地址、大小、权限以及映射的文件等信息。它对于分析进程内存占用、排查内存泄漏、理解程序内存布局非常有用。常用选项
-x 或 --extended:显示扩展格式,提供更详细的内存使用信息(如 RSS、PSS、脏页等)。这是最常用的选项。
-d 或 --device:显示设备格式,包含一些设备相关的信息。
-q 或 --quiet:不显示页眉和页脚行。
-p 或 --show-path:对于映射的文件,显示完整的文件路径(而不是仅显示 basename)。
-A 或 --range <低地址,高地址>:仅显示指定地址范围内的映射。
-XX:显示非常详细的 Linux 内核扩展信息(需要较新版本)。
如果不加任何选项,默认显示简洁格式,每行包含:起始地址、映射大小(Kbytes)、权限、映射名称。
各列含义:
Address:内存映射段的起始虚拟地址。
Kbytes:该段的总大小(以 KB 为单位)。
RSS:常驻内存集大小(Resident Set Size),即当前实际驻留在物理内存中的部分大小(KB)。
Dirty:脏页大小(KB),即被修改过且尚未写回磁盘的页面(通常对私有映射有意义)。
Mode:权限模式,如 r-xp 表示可读、可执行、私有(p表示私有,s表示共享)。
Mapping:映射的名称。可能为:
最后一行 total 显示该进程总的虚拟内存大小(KB)、总 RSS 和总脏页。注意,这里的虚拟内存总和可能远大于物理内存,因为包含已分配但未使用的部分。
pmap -p <pid> #显示完整路径名(尤其对共享库有用)
使用场景
内存泄漏排查:观察堆段([heap])的大小是否持续增长,如果不断增大,可能意味着有内存泄漏。
共享库占用分析:查看哪些共享库占用了大量 RSS,可以帮助优化程序加载或内存占用。
理解程序内存布局:结合 /proc/<pid>/maps 文件,pmap 的输出基本一致,但更人性化。
分析为何进程内存过大:查看各个段的大小,确定是堆、栈还是文件映射占用过多。
注意事项
pmap 显示的是瞬间快照,多次运行结果可能不同(尤其是堆和栈)。
对于线程的栈,通常显示为 [stack:TID](但某些系统可能不区分)。
在容器或受限环境下,某些映射可能无法读取权限信息。
如果需要更详细的内存统计(如 PSS,即比例集大小),pmap -x 中的 RSS 是每个映射独立统计的,可能重复计算了共享库的物理内存。此时可参考 /proc/<pid>/smaps 文件,或用工具如 smem。
总结
pmap -x <pid> 是分析进程内存使用的一把利器,它能直观地展示进程地址空间的构成,帮助你快速定位内存瓶颈或异常。配合其他性能工具(如 top、free、valgrind),可以更全面地掌握系统内存状况。