pmap -x pid 可查看进程内存分布的三类关键信息:起始地址、rss(实际驻留物理内存)和映射来源;需用数字pid,可通过ps、pgrep或systemctl获取;输出含address、kbytes、rss、mode及mapping四列,用于识别堆、栈、共享库和匿名映射等内存段,并支持排序与对比分析。

直接用 pmap -x PID 就能看到进程内存分布的核心细节——不是罗列所有地址,而是快速抓住三类关键信息:每段的起始地址、实际驻留物理内存(RSS)、以及映射来源(比如 [heap]、[stack] 或 /lib64/libc.so.6)。
先准确拿到目标进程 PID
PID 必须是数字,不能传进程名:
- 查 Python 应用:
ps aux | grep "python3 myapp.py",第二列就是 PID;更干净的方式是pgrep -f "myapp.py",能避开 grep 自身进程 - 查 systemd 服务(如 nginx):
systemctl show --property MainPID nginx.service,直接获取主进程 PID - 权限不足时提示 “Permission denied”,需加
sudo pmap -x [pid],但注意这只是读取权限,不改变进程状态
执行 pmap -x 查看带 RSS 的详细映射
必须加 -x,否则看不到 Kbytes 和 RSS,等于白看:
-
pmap -x 12345输出按虚拟地址升序排列,每行是一个 VMA(虚拟内存区域) - 重点四列:Address(可用于 gdb 定位)、Kbytes(该段总大小)、RSS(真正占物理内存的页)、Mode(如 rw-p 表示可读写私有,r-xp 表示可读可执行)
- Mapping 列说明类型:[heap]、[stack]、[vdso]、[anon],或具体路径(如 /usr/lib/x86_64-linux-gnu/libssl.so.1.1)
从输出识别关键内存段的实际含义
pmap 不解析 malloc 小块分配,但它反映内核视角下“哪些地址区域被怎么用了”:
- [heap]:通常是 brk 扩展区,权限为 rw-p;若 Kbytes 和 RSS 持续变大,是堆泄漏的第一线索
- [stack]:主线程栈,地址靠近高地址端,大小通常几 MB;多个 [stack:xxx] 行说明多线程;单个超 8MB 要警惕递归或栈溢出
- 共享库行:同一库可能分多段(代码 r-xp、数据 rw-p),注意设备号和 inode 是否一致,判断是否真共享
- [anon]:匿名映射,无文件路径,常见于 mmap(MAP_ANONYMOUS)、JVM 直接内存或大块 malloc;大量小块且不释放,提示底层分配未配对回收
结合排序与对比做快速筛查
单看输出难发现异常,用 shell 工具辅助定位:
- 按 RSS 降序找真实占内存最多的段:
pmap -x [pid] | sort -k3 -n -r | head -10 - 验证总 RSS 是否合理:
pmap -x [pid] | tail -1 | awk '{print $3}'对比ps -o rss= -p [pid] - 监控变化趋势:写个简单循环,每隔几秒执行一次
pmap -x [pid],重点关注 [heap] 或 [anon] 的 RSS 是否持续上升 - 交叉验证:用
gdb -p [pid]进入后执行info proc mappings,对照原始 /proc/[pid]/maps 内容











