pmap -x pid 可快速定位进程内存段的地址范围、权限类型和映射来源:address(起始地址)、kbytes(大小)、rss(驻留内存)、mode(如 rw-p/r-xp)及 mapping(如 [heap]、[stack]、/lib64/libc.so.6 或 [anon])。

直接用 pmap -x PID 就能看到进程完整的内存段地址映射分布,关键不是“全量罗列”,而是快速定位地址范围、权限类型和映射来源这三类核心信息。
先准确拿到目标进程 PID
不能靠猜或进程名直接传参,pmap 只认数字 PID:
- 查正在运行的 Python 应用:ps aux | grep "python3 myapp.py",第二列就是 PID
- 更精准一点:pgrep -f "myapp.py",避免匹配到日志或 grep 自身
- 如果是 systemd 管理的服务(如 nginx),可用 systemctl show --property MainPID nginx.service 获取主进程 PID
执行 pmap -x 查看带地址的详细映射
必须加 -x,否则只显示十六进制地址和权限,看不到大小和实际驻留内存(RSS):
- pmap -x 12345 输出按虚拟地址升序排列,每行对应一个 VMA(Virtual Memory Area)
- 重点看四列:Address(起始地址,可用于 gdb 定位)、Kbytes(该段总大小)、RSS(真正占用物理内存的页)、Mode(权限,如 r-xp 表示可读可执行私有,rw-p 是可读写私有)
- Mapping 列标出类型:[heap]、[stack]、[vdso]、[anon],或具体路径如 /lib64/libc.so.6
从输出中识别关键地址段的实际含义
pmap 不解析堆内部 malloc 分配,但它能告诉你内核视角下哪些地址区域被怎么用了:
- [heap]:通常是 brk/sbrk 扩展区,地址连续、权限为 rw-p;若 Kbytes 和 RSS 持续变大,是堆泄漏第一线索
- [stack]:主线程栈,地址通常靠近高地址端,大小几十 KB 到几 MB;多个 [stack] 行说明多线程,单个超 8MB 要警惕递归或栈溢出
- 共享库路径行:如 /usr/lib/x86_64-linux-gnu/libssl.so.1.1,同一库可能分多段映射(代码段 r-xp、数据段 rw-p),注意其偏移和设备号是否一致
- [anon]:匿名映射,地址无文件路径,常见于 mmap(MAP_ANONYMOUS) 或 JVM/Native 内存池;大量小块 [anon] 且不释放,提示底层分配未配对回收
补充技巧:结合地址做进一步验证
如果想确认某段地址里实际是什么内容,可以配合其他工具交叉验证:
- 用 gdb -p 12345 进入后执行 info proc mappings,查看原始 /proc/12345/maps 内容,和 pmap -x 对照
- 发现可疑大块 rw-p 区域但 Mapping 为空?大概率是 mmap 分配的匿名内存,可用 cat /proc/12345/smaps | grep -A 5 -B 5 "your_address_range" 查详细页统计
- 想看所有映射是否启用大页?加 -XX 参数:pmap -XX 12345 | grep "MMUPageSize"











