快速参考pmap用于报告进程的内存映射关系是 Linux 系统调试与运维的重要工具。它可以清晰展示进程占用的虚拟内存区域VMA包括每个内存段的起始地址、大小、权限以及对应的文件映射。 目录命令简介语法格式常用选项输出字段说明实战示例与其他工具对比高级用法常见问题自动化脚本 命令简介pmapProcess Map是 Linux 下用于查看进程虚拟地址空间分布的命令行工具。它通过读取/proc/pid/maps和/proc/pid/smaps文件来获取进程的内存映射信息。 核心能力能力说明内存布局分析查看进程的代码段、数据段、堆、栈及共享库的映射位置内存使用统计统计各内存区域的大小、驻留集大小RSS及脏页数量匿名内存识别区分文件映射内存与匿名映射内存标记为[ anon ]权限检查每段内存的读写执行权限一目了然r/w/x 适用场景场景说明内存泄漏排查观察进程内存持续增长的区域定位泄漏来源性能调优分析共享库加载情况优化内存占用安全审计检查是否有可写且可执行的内存段rwx故障诊断进程 OOM 或被 kill 时分析内存使用状况⚠️本质原理pmap是对/proc/pid/maps和/proc/pid/smaps文件的格式化展示工具。也可以直接阅读这些文件获得相同信息。 语法格式pmap[选项]PID[...]参数说明参数说明PID必填目标进程的进程 ID可同时指定多个选项可选控制输出格式和详细程度的参数基本用法# 查看 PID 为 1234 的进程的内存映射pmap1234# 同时查看多个进程pmap12345678# 查看当前 Shell 进程pmap$$⚙️ 常用选项选项说明-x, --extended显示扩展格式包含地址、大小、RSS、脏页、权限、映射文件-d, --device显示设备号主设备号:次设备号-q, --quiet安静模式不显示头部和尾部汇总行-A, --range LOW,HIGH仅显示指定地址范围内的映射-X比-x更详细显示 RSS 和脏页差值信息-XX显示内核提供的所有信息需要较新的内核支持-p, --show-path显示映射文件的完整路径-c, --read-rc读取默认配置文件-C, --read-rc-from FILE从指定文件读取配置-V, --version显示版本信息-h, --help显示帮助信息⚡ 各发行版注意事项发行版提供包说明RHEL/CentOS 7/8/9procps-ng默认安装pmap随procps-ng一起提供Ubuntu/Debianprocps默认安装无需额外安装Alpine Linuxprocps最小化安装可能不包含需apk add procpsopenSUSEprocps默认安装Arch Linuxprocps-ng默认安装# 检查 pmap 是否可用whichpmappmap--version# Alpine 安装如未预装apkaddprocps 输出字段说明默认输出格式$ pmap11: /usr/lib/systemd/systemd 0000555555554000 1608K r-x-- systemd 00005555558e7000 140K r---- systemd 000055555590a000 52K rw--- systemd 0000555555c8d000 688K rw---[anon]00007ffff7a00000 1828K r-x-- libc-2.31.so 00007ffff7bc9000 2044K ----- libc-2.31.so 00007ffff7dc8000 16K r---- libc-2.31.so 00007ffff7dcc000 8K rw--- libc-2.31.so 00007ffff7dce000 52K rw---[anon]00007ffff7fcf000 12K rw---[anon]00007ffffffde000 132K rw---[stack]total 32956K扩展输出-x字段详解$ pmap-x1Address Kbytes RSS Dirty Mode Mapping 0000555555554000160811880r-x-- systemd 00005555558e7000140140140r---- systemd 000055555590a000525252rw--- systemd 0000555555c8d000688340340rw---[anon]... total kB3295688007364字段说明Address虚拟内存区域的起始地址十六进制Kbytes该区域的总大小KB虚拟内存占用RSS常驻内存集大小KB实际占用的物理内存Dirty脏页大小KB被修改但尚未写回磁盘的页面Mode内存权限r读,w写,x执行,s共享,p私有Mapping映射来源共享库路径 /[ anon ]匿名内存/[ stack ]栈/[ heap ]堆匿名内存标记说明标记含义[ anon ]匿名映射——没有对应文件的内存区域如malloc分配的内存[ stack ]进程的主线程栈[ heap ]进程的堆区域brk()系统调用扩展[ vvar ]内核暴露给用户空间的只读变量页vDSO数据区[ vdso ]虚拟动态共享对象加速系统调用[ vsyscall ]旧版系统调用加速机制已被 vDSO 取代 实战示例1. 查看指定进程的内存映射# 获取 nginx 的主进程 PIDnginx_pid$(pgrep-fnginx: master|head-1)# 查看 nginx 主进程的内存布局pmap$nginx_pid|head-302. 扩展格式查看详细信息# -x 显示 RSS 和脏页pmap-x1# -d 额外显示设备号pmap-d1# 组合使用pmap-x-d13. 查看特定地址范围# 仅查看 0x7f0000000000 到 0x7fffffffffff 范围内的映射通常是共享库区域pmap-A0x7f0000000000,0x7fffffffffff12344. 统计进程的 RSS 总量# 使用扩展模式只看汇总行pmap-x$$|tail-1# 输出示例# total kB 32956 8800 7364# 解释虚拟内存 32956KB物理内存 8800KB脏页 7364KB5. 分析内存使用占比# 查看各映射区域按大小排序pmap-x$$|sort-k3-n-r|head-206. 批量检查多个相关进程# 查看所有 nginx 进程的内存映射pgrep nginx|xargs-I{}sh-cecho PID: {} ; pmap -x {} | tail -1 与其他工具对比工具定位优势劣势pmap进程内存映射报告简洁直观适合快速查看无法实时更新/proc/pid/maps原始数据源随时可读无需安装工具格式不友好无汇总/proc/pid/smaps详细内存统计包含 PSS、Swap 等字段数据量大需手动汇总smem内存使用统计支持 PSS/USS可按用户汇总需要额外安装ps进程状态显示总 RSS/VSZ无法看到内存分布细节top/htop实时监控动态更新交互式无法显示内存映射详情valgrind massif堆分析详细的堆内存使用趋势性能开销大不适合生产环境不同工具获取信息的对比# pmap直观的内存映射报告pmap-x$$# ps总内存占用概览ps-opid,rss,vsz,comm-p$$# /proc/PID/smaps最详细的信息cat/proc/$$/smaps|grep-E^(Pss|Rss|Swap):|awk{sum$2} END {print PSS:, sum, kB}# smemPSS 统计需安装smem-p-P$$2/dev/null 高级用法1. 监控进程内存增长排查内存泄漏#!/bin/bash# 每 5 秒记录一次进程的 RSS 变化PID$1INTERVAL5COUNT12echo时间,RSS(KB),Dirty(KB)foriin$(seq1$COUNT);dostats$(pmap-x$PID2/dev/null|tail-1|awk{print $3, $4})echo$(date%H:%M:%S),$statssleep$INTERVALdone2. 分析匿名内存占用# 找出进程中所有匿名内存区域的总大小pmap-x$$|grep\[ anon \]|awk{sum$2} END {print 匿名内存总计:, sum, KB}# 找出 RSS 最大的匿名区域pmap-x$$|grep\[ anon \]|sort-k3-n-r|head-53. 检查可写且可执行的内存区域安全检查# rwx 权限段意味着该内存区域既可写又可执行——存在安全隐患pmap$$|greprwx# 正常情况下应该没有或极少输出# 大量 rwx 段可能表明使用了不安全的 JIT 编译或存在安全漏洞4. 对比进程前后内存变化# 记录基准状态pmap-x$$/tmp/pmap_before.txt# 执行某些操作...# sleep 30# 记录后续状态pmap-x$$/tmp/pmap_after.txt# 对比 RSS 总量变化echoBefore:$(tail-1/tmp/pmap_before.txt|awk{print $3})KBechoAfter:$(tail-1/tmp/pmap_after.txt|awk{print $3})KB5. 生成进程内存分布报告#!/bin/bash# 将内存映射按类型分类汇总PID${1:-$$}echo PID:$PID内存分类汇总 echopmap-x$PID2/dev/null|awk NR2 !/^total/ { if ($5 ~ /\[stack\]/) { stack$2; rss_stack$3 } else if ($5 ~ /\[heap\]/) { heap$2; rss_heap$3 } else if ($5 ~ /\[anon\]/) { anon$2; rss_anon$3 } else if ($5 ~ /\[vdso\]|\[vvar\]/) { vdso$2; rss_vdso$3 } else if ($5 ~ /\.so/) { libs$2; rss_libs$3 } else if ($5 !~ /\[/) { code$2; rss_code$3 } else { other$2; rss_other$3 } } END { printf %-20s %10s %10s\n, 类别, 虚拟内存(KB), 物理内存(KB) printf %-20s %10s %10s\n, ----, ------------, ------------ printf %-20s %10d %10d\n, 代码段(可执行文件), code, rss_code printf %-20s %10d %10d\n, 共享库(.so), libs, rss_libs printf %-20s %10d %10d\n, 堆(heap), heap, rss_heap printf %-20s %10d %10d\n, 栈(stack), stack, rss_stack printf %-20s %10d %10d\n, 匿名映射(anon), anon, rss_anon printf %-20s %10d %10d\n, vDSO/vvar, vdso, rss_vdso printf %-20s %10d %10d\n, 其他, other, rss_other printf %-20s %10s %10s\n, ----, ------------, ------------ printf %-20s %10d %10d\n, 总计, codelibsheapstackanonvdsoother, rss_coderss_libsrss_heaprss_stackrss_anonrss_vdsorss_other }⚠️ 常见问题1. 权限不足# 查看 root 进程会报错$ pmap11: Operation not permitted# 解决方案使用 sudosudopmap1⚠️注意从内核 3.2 开始普通用户只能查看自己拥有的进程的/proc/pid/maps受ptrace访问控制限制。2. 进程已退出# 进程退出后查看$ pmap9999999999: No such process# 解决方案先确认进程是否存在ps-p99999/dev/null21pmap99999||echo进程不存在3. 输出过长导致截断# 对于大型进程如 Java/数据库输出可能非常长pmap-x$(pgrepjava)|wc-l# 建议分页查看或过滤pmap-x$(pgrepjava)|lesspmap-x$(pgrepjava)|grep-Eheap|stack|anon4. 读取 smaps 很慢# -XX 选项需要读取 smaps对于内存大且映射多的进程会很慢# 例如一个 Java 进程可能有数千个内存映射# 替代方案使用 -x 而非 -XXtimepmap-x$(pgrepjava)# 较快timepmap-XX$(pgrepjava)# 可能耗时数秒 自动化脚本内存泄漏监控脚本#!/bin/bash# pmap_mem_watch.sh - 监控进程内存变化趋势# 用法: ./pmap_mem_watch.sh PID [检测次数] [间隔秒数]PID$1CHECKS${2:-60}INTERVAL${3:-10}if[-z$PID];thenecho用法:$0PID [检测次数] [间隔秒数]exit1fi# 检查进程是否存在if!kill-0$PID2/dev/null;thenecho错误: 进程$PID不存在exit1fiecho开始监控 PID$PID共$CHECKS次间隔${INTERVAL}secho时间 | 虚拟内存(KB) | 物理内存(KB) | 脏页(KB) echo------------------------------------------------------foriin$(seq1$CHECKS);doif!kill-0$PID2/dev/null;thenecho$(date%Y-%m-%d %H:%M:%S)| 进程已退出breakfistats$(pmap-x$PID2/dev/null|tail-1|awk{printf %s | %s | %s, $2, $3, $4})printf%s | %s\n$(date%Y-%m-%d %H:%M:%S)$statssleep$INTERVALdone查找匿名内存占用最大的进程#!/bin/bash# 列出当前系统中匿名内存anon占用最多的前10个进程echo匿名内存 Top 10 进程echoPID 进程名 匿名内存(KB)echo-------- ------------------ -------------forpid_dirin/proc/[0-9]*;dopid$(basename$pid_dir)# 跳过内核线程comm 为空的情况[-f$pid_dir/comm]||continuecomm$(tr\0 $pid_dir/comm2/dev/null)# 计算匿名内存总量anon_kb$(awk/\[anon\]/ {sum$2} END {print sum0}$pid_dir/smaps2/dev/null)if[${anon_kb:-0}-gt0];thenprintf%-8s %-18s %s\n$pid${comm:0:18}$anon_kbfidone|sort-k3-n-r|head-10 总结pmap是 Linux 系统中进程内存分析的利器。它能清晰展示进程的虚拟地址空间分布帮助运维人员和开发者快速定位内存泄漏、分析内存占用结构、评估进程的内存健康度。相比直接阅读/proc/pid/maps和/proc/pid/smapspmap提供了更友好的格式化输出和汇总统计。在日常工作中pmap与ps、top、smem等工具配合使用可以构成完整的内存监控体系。对于排查 Java 堆外内存、Node.js Buffer 内存、数据库缓存区等场景pmap的-x扩展输出尤为实用。
Linux命令-pmap(进程内存映射报告工具)
快速参考pmap用于报告进程的内存映射关系是 Linux 系统调试与运维的重要工具。它可以清晰展示进程占用的虚拟内存区域VMA包括每个内存段的起始地址、大小、权限以及对应的文件映射。 目录命令简介语法格式常用选项输出字段说明实战示例与其他工具对比高级用法常见问题自动化脚本 命令简介pmapProcess Map是 Linux 下用于查看进程虚拟地址空间分布的命令行工具。它通过读取/proc/pid/maps和/proc/pid/smaps文件来获取进程的内存映射信息。 核心能力能力说明内存布局分析查看进程的代码段、数据段、堆、栈及共享库的映射位置内存使用统计统计各内存区域的大小、驻留集大小RSS及脏页数量匿名内存识别区分文件映射内存与匿名映射内存标记为[ anon ]权限检查每段内存的读写执行权限一目了然r/w/x 适用场景场景说明内存泄漏排查观察进程内存持续增长的区域定位泄漏来源性能调优分析共享库加载情况优化内存占用安全审计检查是否有可写且可执行的内存段rwx故障诊断进程 OOM 或被 kill 时分析内存使用状况⚠️本质原理pmap是对/proc/pid/maps和/proc/pid/smaps文件的格式化展示工具。也可以直接阅读这些文件获得相同信息。 语法格式pmap[选项]PID[...]参数说明参数说明PID必填目标进程的进程 ID可同时指定多个选项可选控制输出格式和详细程度的参数基本用法# 查看 PID 为 1234 的进程的内存映射pmap1234# 同时查看多个进程pmap12345678# 查看当前 Shell 进程pmap$$⚙️ 常用选项选项说明-x, --extended显示扩展格式包含地址、大小、RSS、脏页、权限、映射文件-d, --device显示设备号主设备号:次设备号-q, --quiet安静模式不显示头部和尾部汇总行-A, --range LOW,HIGH仅显示指定地址范围内的映射-X比-x更详细显示 RSS 和脏页差值信息-XX显示内核提供的所有信息需要较新的内核支持-p, --show-path显示映射文件的完整路径-c, --read-rc读取默认配置文件-C, --read-rc-from FILE从指定文件读取配置-V, --version显示版本信息-h, --help显示帮助信息⚡ 各发行版注意事项发行版提供包说明RHEL/CentOS 7/8/9procps-ng默认安装pmap随procps-ng一起提供Ubuntu/Debianprocps默认安装无需额外安装Alpine Linuxprocps最小化安装可能不包含需apk add procpsopenSUSEprocps默认安装Arch Linuxprocps-ng默认安装# 检查 pmap 是否可用whichpmappmap--version# Alpine 安装如未预装apkaddprocps 输出字段说明默认输出格式$ pmap11: /usr/lib/systemd/systemd 0000555555554000 1608K r-x-- systemd 00005555558e7000 140K r---- systemd 000055555590a000 52K rw--- systemd 0000555555c8d000 688K rw---[anon]00007ffff7a00000 1828K r-x-- libc-2.31.so 00007ffff7bc9000 2044K ----- libc-2.31.so 00007ffff7dc8000 16K r---- libc-2.31.so 00007ffff7dcc000 8K rw--- libc-2.31.so 00007ffff7dce000 52K rw---[anon]00007ffff7fcf000 12K rw---[anon]00007ffffffde000 132K rw---[stack]total 32956K扩展输出-x字段详解$ pmap-x1Address Kbytes RSS Dirty Mode Mapping 0000555555554000160811880r-x-- systemd 00005555558e7000140140140r---- systemd 000055555590a000525252rw--- systemd 0000555555c8d000688340340rw---[anon]... total kB3295688007364字段说明Address虚拟内存区域的起始地址十六进制Kbytes该区域的总大小KB虚拟内存占用RSS常驻内存集大小KB实际占用的物理内存Dirty脏页大小KB被修改但尚未写回磁盘的页面Mode内存权限r读,w写,x执行,s共享,p私有Mapping映射来源共享库路径 /[ anon ]匿名内存/[ stack ]栈/[ heap ]堆匿名内存标记说明标记含义[ anon ]匿名映射——没有对应文件的内存区域如malloc分配的内存[ stack ]进程的主线程栈[ heap ]进程的堆区域brk()系统调用扩展[ vvar ]内核暴露给用户空间的只读变量页vDSO数据区[ vdso ]虚拟动态共享对象加速系统调用[ vsyscall ]旧版系统调用加速机制已被 vDSO 取代 实战示例1. 查看指定进程的内存映射# 获取 nginx 的主进程 PIDnginx_pid$(pgrep-fnginx: master|head-1)# 查看 nginx 主进程的内存布局pmap$nginx_pid|head-302. 扩展格式查看详细信息# -x 显示 RSS 和脏页pmap-x1# -d 额外显示设备号pmap-d1# 组合使用pmap-x-d13. 查看特定地址范围# 仅查看 0x7f0000000000 到 0x7fffffffffff 范围内的映射通常是共享库区域pmap-A0x7f0000000000,0x7fffffffffff12344. 统计进程的 RSS 总量# 使用扩展模式只看汇总行pmap-x$$|tail-1# 输出示例# total kB 32956 8800 7364# 解释虚拟内存 32956KB物理内存 8800KB脏页 7364KB5. 分析内存使用占比# 查看各映射区域按大小排序pmap-x$$|sort-k3-n-r|head-206. 批量检查多个相关进程# 查看所有 nginx 进程的内存映射pgrep nginx|xargs-I{}sh-cecho PID: {} ; pmap -x {} | tail -1 与其他工具对比工具定位优势劣势pmap进程内存映射报告简洁直观适合快速查看无法实时更新/proc/pid/maps原始数据源随时可读无需安装工具格式不友好无汇总/proc/pid/smaps详细内存统计包含 PSS、Swap 等字段数据量大需手动汇总smem内存使用统计支持 PSS/USS可按用户汇总需要额外安装ps进程状态显示总 RSS/VSZ无法看到内存分布细节top/htop实时监控动态更新交互式无法显示内存映射详情valgrind massif堆分析详细的堆内存使用趋势性能开销大不适合生产环境不同工具获取信息的对比# pmap直观的内存映射报告pmap-x$$# ps总内存占用概览ps-opid,rss,vsz,comm-p$$# /proc/PID/smaps最详细的信息cat/proc/$$/smaps|grep-E^(Pss|Rss|Swap):|awk{sum$2} END {print PSS:, sum, kB}# smemPSS 统计需安装smem-p-P$$2/dev/null 高级用法1. 监控进程内存增长排查内存泄漏#!/bin/bash# 每 5 秒记录一次进程的 RSS 变化PID$1INTERVAL5COUNT12echo时间,RSS(KB),Dirty(KB)foriin$(seq1$COUNT);dostats$(pmap-x$PID2/dev/null|tail-1|awk{print $3, $4})echo$(date%H:%M:%S),$statssleep$INTERVALdone2. 分析匿名内存占用# 找出进程中所有匿名内存区域的总大小pmap-x$$|grep\[ anon \]|awk{sum$2} END {print 匿名内存总计:, sum, KB}# 找出 RSS 最大的匿名区域pmap-x$$|grep\[ anon \]|sort-k3-n-r|head-53. 检查可写且可执行的内存区域安全检查# rwx 权限段意味着该内存区域既可写又可执行——存在安全隐患pmap$$|greprwx# 正常情况下应该没有或极少输出# 大量 rwx 段可能表明使用了不安全的 JIT 编译或存在安全漏洞4. 对比进程前后内存变化# 记录基准状态pmap-x$$/tmp/pmap_before.txt# 执行某些操作...# sleep 30# 记录后续状态pmap-x$$/tmp/pmap_after.txt# 对比 RSS 总量变化echoBefore:$(tail-1/tmp/pmap_before.txt|awk{print $3})KBechoAfter:$(tail-1/tmp/pmap_after.txt|awk{print $3})KB5. 生成进程内存分布报告#!/bin/bash# 将内存映射按类型分类汇总PID${1:-$$}echo PID:$PID内存分类汇总 echopmap-x$PID2/dev/null|awk NR2 !/^total/ { if ($5 ~ /\[stack\]/) { stack$2; rss_stack$3 } else if ($5 ~ /\[heap\]/) { heap$2; rss_heap$3 } else if ($5 ~ /\[anon\]/) { anon$2; rss_anon$3 } else if ($5 ~ /\[vdso\]|\[vvar\]/) { vdso$2; rss_vdso$3 } else if ($5 ~ /\.so/) { libs$2; rss_libs$3 } else if ($5 !~ /\[/) { code$2; rss_code$3 } else { other$2; rss_other$3 } } END { printf %-20s %10s %10s\n, 类别, 虚拟内存(KB), 物理内存(KB) printf %-20s %10s %10s\n, ----, ------------, ------------ printf %-20s %10d %10d\n, 代码段(可执行文件), code, rss_code printf %-20s %10d %10d\n, 共享库(.so), libs, rss_libs printf %-20s %10d %10d\n, 堆(heap), heap, rss_heap printf %-20s %10d %10d\n, 栈(stack), stack, rss_stack printf %-20s %10d %10d\n, 匿名映射(anon), anon, rss_anon printf %-20s %10d %10d\n, vDSO/vvar, vdso, rss_vdso printf %-20s %10d %10d\n, 其他, other, rss_other printf %-20s %10s %10s\n, ----, ------------, ------------ printf %-20s %10d %10d\n, 总计, codelibsheapstackanonvdsoother, rss_coderss_libsrss_heaprss_stackrss_anonrss_vdsorss_other }⚠️ 常见问题1. 权限不足# 查看 root 进程会报错$ pmap11: Operation not permitted# 解决方案使用 sudosudopmap1⚠️注意从内核 3.2 开始普通用户只能查看自己拥有的进程的/proc/pid/maps受ptrace访问控制限制。2. 进程已退出# 进程退出后查看$ pmap9999999999: No such process# 解决方案先确认进程是否存在ps-p99999/dev/null21pmap99999||echo进程不存在3. 输出过长导致截断# 对于大型进程如 Java/数据库输出可能非常长pmap-x$(pgrepjava)|wc-l# 建议分页查看或过滤pmap-x$(pgrepjava)|lesspmap-x$(pgrepjava)|grep-Eheap|stack|anon4. 读取 smaps 很慢# -XX 选项需要读取 smaps对于内存大且映射多的进程会很慢# 例如一个 Java 进程可能有数千个内存映射# 替代方案使用 -x 而非 -XXtimepmap-x$(pgrepjava)# 较快timepmap-XX$(pgrepjava)# 可能耗时数秒 自动化脚本内存泄漏监控脚本#!/bin/bash# pmap_mem_watch.sh - 监控进程内存变化趋势# 用法: ./pmap_mem_watch.sh PID [检测次数] [间隔秒数]PID$1CHECKS${2:-60}INTERVAL${3:-10}if[-z$PID];thenecho用法:$0PID [检测次数] [间隔秒数]exit1fi# 检查进程是否存在if!kill-0$PID2/dev/null;thenecho错误: 进程$PID不存在exit1fiecho开始监控 PID$PID共$CHECKS次间隔${INTERVAL}secho时间 | 虚拟内存(KB) | 物理内存(KB) | 脏页(KB) echo------------------------------------------------------foriin$(seq1$CHECKS);doif!kill-0$PID2/dev/null;thenecho$(date%Y-%m-%d %H:%M:%S)| 进程已退出breakfistats$(pmap-x$PID2/dev/null|tail-1|awk{printf %s | %s | %s, $2, $3, $4})printf%s | %s\n$(date%Y-%m-%d %H:%M:%S)$statssleep$INTERVALdone查找匿名内存占用最大的进程#!/bin/bash# 列出当前系统中匿名内存anon占用最多的前10个进程echo匿名内存 Top 10 进程echoPID 进程名 匿名内存(KB)echo-------- ------------------ -------------forpid_dirin/proc/[0-9]*;dopid$(basename$pid_dir)# 跳过内核线程comm 为空的情况[-f$pid_dir/comm]||continuecomm$(tr\0 $pid_dir/comm2/dev/null)# 计算匿名内存总量anon_kb$(awk/\[anon\]/ {sum$2} END {print sum0}$pid_dir/smaps2/dev/null)if[${anon_kb:-0}-gt0];thenprintf%-8s %-18s %s\n$pid${comm:0:18}$anon_kbfidone|sort-k3-n-r|head-10 总结pmap是 Linux 系统中进程内存分析的利器。它能清晰展示进程的虚拟地址空间分布帮助运维人员和开发者快速定位内存泄漏、分析内存占用结构、评估进程的内存健康度。相比直接阅读/proc/pid/maps和/proc/pid/smapspmap提供了更友好的格式化输出和汇总统计。在日常工作中pmap与ps、top、smem等工具配合使用可以构成完整的内存监控体系。对于排查 Java 堆外内存、Node.js Buffer 内存、数据库缓存区等场景pmap的-x扩展输出尤为实用。