pmap命令

简介   

        pmap(process memory map)用于查看进程内存映射,即进程的内存地址空间。pmap 从文件 /proc/<pid>/maps 中获得相关数据,用来观察系统中指定进程的地址空间分布和内存状态信息,包括进程各个段的大小。对查看完整的进程地址空间很有帮助。

常用参数


pmap命令的使用格式:pmap [options] pid [...]

其中参数及释义如下:

  1. -x, --extended
  2. 显示扩展格式。
  3. -d, --device
  4. 显示设备格式。
  5. -q, --quiet
  6. 不显示某些页眉或页脚行。
  7. -A, --range <low>,<high>
  8. 将结果限制在给定范围内的低地址和高地址。
  9. -X
  10. 显示比 -x 选项更多的细节。 警告:根据 /proc/PID/smaps 改变格式。
  11. -XX
  12. 显示内核提供的所有内容。
  13. -p, --show-path
  14. 在映射列中显示文件的完整路径。
  15. -c, --read-rc
  16. 读取默认配置。
  17. -C, --read-rc-from <file>
  18. 从指定文件读取配置。
  19. -n, --create-rc
  20. 创建新的默认配置。
  21. -N, --create-rc-to file
  22. 创建新配置到指定文件。
  23. -h, --help
  24. 现实帮助信息并退出。
  25. -V, --version
  26. 显示版本信息并退出。

其中使用最多的就是-x参数,用于配合其他命令查看内存内容

各列释义

如下是在测试环境部署的一个java应用,应用pid是17977,使用pmap查看该应用的相关内存信息:

pmap -x 17977

Address:表示此内存段的起始地址
Kbytes:表示此内存段的大小(ps:这是虚拟内存)
RSS:表示此内存段实际分配的物理内存,这是由于Linux是延迟分配内存的,进程调用malloc时Linux只是分配了一段虚拟内存块,直到进程实际读写此内存块中部分时,Linux会通过缺页中断真正分配物理内存。
Dirty:此内存段中被修改过的内存大小,使用mmap系统调用申请虚拟内存时,可以关联到某个文件,也可不关联,当关联了文件的内存段被访问时,会自动读取此文件的数据到内存中,若此段某一页内存数据后被更改,即为Dirty,而对于非文件映射的匿名内存段(anon),此列与RSS相等。
Mode:内存段是否可读(r)可写(w)可执行(x)
Mapping:内存段映射的文件,匿名内存段显示为anon,非匿名内存段显示文件名(加-p可显示全路径)。

简单使用

如果只是单纯的查看内存映射段,对于实际应用应该是毫无意义,如果配合其他的命令一起使用就能发挥大作用

比如想查看内存其实段:000000076ab00000的内容信息,使用命令


tail -c +$((0x000000076ab00000+1)) /proc/17977/mem|head -c $((11616*1024))|strings|less -S

查看到的数据信息如下:

说明:

Linux将进程内存虚拟为伪文件/proc/$pid/mem,通过它即可查看进程内存中的数据。

tail用于偏移到指定内存段的起始地址,这里指定了内存段地址其实位置+1,

head用于读取指定大小,后面读取的大小为11616kb。
strings用于找出内存中的字符串数据,如果该内存段存储的数据是二进制数据,显示乱码