当前位置:首页>Linux>Linux的pmap命令

Linux的pmap命令

  • 2026-09-02 19:50:31
Linux的pmap命令
pmap 是一个 Linux/Unix 系统下的命令行工具,用于报告进程的内存映射情况,即进程地址空间中的各个内存段(如代码段、数据段、共享库、堆、栈等)的起始地址、大小、权限以及映射的文件等信息。它对于分析进程内存占用、排查内存泄漏、理解程序内存布局非常有用。
pmap [选项] <PID>...
  • PID:进程 ID,可以指定一个或多个,用空格分隔。

常用选项

  • -x 或 --extended:显示扩展格式,提供更详细的内存使用信息(如 RSS、PSS、脏页等)。这是最常用的选项。

  • -d 或 --device:显示设备格式,包含一些设备相关的信息。

  • -q 或 --quiet:不显示页眉和页脚行。

  • -p 或 --show-path:对于映射的文件,显示完整的文件路径(而不是仅显示 basename)。

  • -A 或 --range <低地址,高地址>:仅显示指定地址范围内的映射。

  • -XX:显示非常详细的 Linux 内核扩展信息(需要较新版本)。

如果不加任何选项,默认显示简洁格式,每行包含:起始地址、映射大小(Kbytes)、权限、映射名称。

pmap -x <pid>

各列含义:

  • Address:内存映射段的起始虚拟地址。

  • Kbytes:该段的总大小(以 KB 为单位)。

  • RSS:常驻内存集大小(Resident Set Size),即当前实际驻留在物理内存中的部分大小(KB)。

  • Dirty:脏页大小(KB),即被修改过且尚未写回磁盘的页面(通常对私有映射有意义)。

  • Mode:权限模式,如 r-xp 表示可读、可执行、私有(p表示私有,s表示共享)。

  • Mapping:映射的名称。可能为:

    • 可执行文件或共享库的路径。

    • [heap]:堆区。

    • [stack]:主线程栈。

    • [vdso]、[vsyscall]:内核提供的虚拟动态共享对象,用于加速系统调用。

    • [anon] 或空白:匿名映射(如 malloc 分配的内存,或未命名的 mmap)。

最后一行 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),可以更全面地掌握系统内存状况。

最新文章

随机文章