pmap -x 是查看进程内存分布的关键命令,必须加-x才能显示Size、RSS、Dirty等核心指标;重点关注[heap](堆泄漏嫌疑)、[stack](栈异常)、共享库路径(如/lib64/libc.so.6)和[anon](匿名映射异常)四类标记段。

用 pmap -x 查特定进程的堆栈和共享库分布,关键不是“看全”,而是“抓重点”:快速识别哪些内存段在涨、哪些映射异常、哪些区域与堆/栈/共享库直接相关。它不分析代码逻辑,但能告诉你内核当前记录的内存布局快照。
确认目标进程 PID 并执行 pmap -x
先用 ps aux | grep your_app 或 pgrep -f "your_app" 找到准确 PID。务必加 -x 参数,否则只显示地址和权限,看不到 KB 单位的大小和 RSS:
-
pmap -x 1234输出包含三列核心数据:Size(虚拟内存大小)、RSS(实际驻留物理内存)、Dirty(已修改未写回的页) - 不加
-x的输出无法判断内存占用量,等于白跑 - 若提示
Permission denied,通常是因为进程设置了PR_SET_DUMPABLE=0或正被 gdb 附加,需用 root 或检查应用启动配置
从输出中快速定位堆、栈、共享库对应行
pmap 不解析堆内部结构,但会把典型区域打上明确标签。重点关注以下几类 Mapping 字段:
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
-
[heap]:代表通过
brk或sbrk扩展的堆区,通常连续且可写;若 Size 和 RSS 持续增长,是堆泄漏首要嫌疑 - [stack]:主线程栈,一般几十 KB 到几 MB;若出现多个 [stack] 行(如线程栈),或单个 [stack] 超过 8MB,需检查是否递归过深或线程数异常
-
带路径的 .so 文件:如
/lib64/libc-2.31.so、/usr/lib/x86_64-linux-gnu/libssl.so.1.1,每行对应一个共享库映射段;注意其权限组合(r-x-- 是代码段,rw--- 是数据段) - [anon]:匿名映射,包括 mmap(MAP_ANONYMOUS) 分配的大块内存,常见于自定义内存池、JVM Native Memory、Python C 扩展等;大量小块 [anon] 反复出现且不释放,高度提示 malloc/free 不匹配
结合多次采样判断内存增长趋势
pmap 是瞬时快照,单次结果只能看静态分布。要判断是否泄漏,必须横向对比:
- 间隔 10–30 秒运行多次
pmap -x [PID],提取每轮的总 RSS 和各 [anon]/[heap] 行的 RSS 值 - 用
awk '{sum += $3} END {print sum}'快速汇总 RSS 总和($3 是 RSS 列) - 若某 [anon] 区域 RSS 从 2MB → 16MB → 64MB 持续翻倍,而应用无预期加载行为,基本可锁定该映射来源为泄漏点
- 注意区分正常增长(如缓存预热)和异常累积(RSS 涨后不回落)
补充技巧:用 -XX 看页级细节(按需)
当发现可疑 [anon] 或 [heap] 区域时,可用 pmap -XX [PID] 进一步查看是否启用了大页(Huge Page)或存在大量 4KB 小页碎片:
- 输出中若某段显示
MMUPageSize: 2048 kB,说明用了 2MB 大页,适合大块连续分配 - 若同一 [anon] 区域由数百个 4KB 页组成且 Dirty 比例高,可能是频繁小内存申请未合并,易引发 TLB 压力
- 该选项信息密度高,日常排查建议先用
-x定向,再用-XX深挖










