Linux pmap 查看进程内存分布

6次阅读

pmaplinux 下查看进程内存映射的命令行工具,支持默认、扩展(-x)和详细(-xx)模式,可识别 heap、stack、共享库、匿名映射和映射文件等区域,常配合 ps、sort 等命令分析内存占用与泄漏。

Linux pmap 查看进程内存分布

pmap 是 Linux 下一个实用的命令行工具,用于显示指定进程的内存映射(memory map)详情,帮助你直观了解该进程在虚拟地址空间中如何分配和使用内存,比如代码段、、共享库、内存映射文件等。

基本用法:查看进程内存分布

只需提供目标进程的 PID 即可:

  • pmap —— 显示默认格式(简洁视图,按段分组)
  • pmap -x —— 显示扩展信息,含 RSS(常驻内存)、PSS(比例集大小)、Dirty(脏页)等列,适合分析实际内存占用
  • pmap -XX —— 更详细的内部统计(需内核支持,部分发行版不启用)

识别关键内存区域

pmap 输出每行代表一个内存映射区,字段依次为:起始地址、大小(KB)、权限(rwxp)、偏移、设备号、inode、路径(若为文件映射)。重点关注以下几类:

  • [heap] —— 堆内存,malloc/new 分配的动态内存,大小持续增长可能暗示内存泄漏
  • [stack] —— 线程栈,通常 8MB 左右;多线程会显示多个 stack(如 [stack:12345])
  • shared libraries —— 如 /lib64/libc.so.6,注意其大小包含代码+数据,但多进程共享,RSS 不全归该进程
  • [anon] —— 匿名映射(如 mmap(MAP_ANONYMOUS)),常见于大块堆分配或 jvm 的直接内存
  • mapped files —— 如 /usr/bin/bash 或日志文件,说明进程通过 mmap 加载或访问了该文件

结合其他命令快速定位问题

pmap 本身不实时监控,需配合其他工具增强分析能力:

  • 找 PID:ps aux | grep your_apppidof nginx
  • 看总体内存:ps -o pid,rss,vsz,comm -p 对比 RSS 和 pmap 总和是否一致
  • 查大内存块:pmap -x | sort -k3 -n -r | head -10 —— 按 RSS 降序列出前 10 大映射区
  • 确认是否为内存泄漏:pmap -x 多次执行,观察 [heap] 或 [anon] 区域是否持续增长

注意事项与局限性

pmap 展示的是进程的虚拟内存布局,并非所有区域都真实占用物理内存。例如:

  • 写时复制(COW)页面在未修改前不计入独占 RSS
  • swap 中的页面仍算在 VSZ,但不在 RSS 中
  • 内核线程(如 kthreadd)无用户态内存映射,pmap 可能报“no maps”
  • 容器环境中的 PID 命名空间需确保在对应 Namespace 内执行,否则看不到目标进程
text=ZqhQzanResources