简介
pmap(process memory map)用于查看进程的内存映射,即进程的内存地址空间。pmap 从文件 /proc/<pid>/maps
中获得相关数据,用来观察系统中指定进程的地址空间分布和内存状态信息,包括进程各个段的大小。对查看完整的进程地址空间很有帮助。
常用参数
pmap命令的使用格式:pmap [options] pid [...]
其中参数及释义如下:
-x, --extended
显示扩展格式。
-d, --device
显示设备格式。
-q, --quiet
不显示某些页眉或页脚行。
-A, --range <low>,<high>
将结果限制在给定范围内的低地址和高地址。
-X
显示比 -x 选项更多的细节。 警告:根据 /proc/PID/smaps 改变格式。
-XX
显示内核提供的所有内容。
-p, --show-path
在映射列中显示文件的完整路径。
-c, --read-rc
读取默认配置。
-C, --read-rc-from <file>
从指定文件读取配置。
-n, --create-rc
创建新的默认配置。
-N, --create-rc-to file
创建新配置到指定文件。
-h, --help
现实帮助信息并退出。
-V, --version
显示版本信息并退出。
其中使用最多的就是-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用于找出内存中的字符串数据,如果该内存段存储的数据是二进制数据,显示乱码