pmap
ldd
lsof
strace
sar
vmstat
iostat
要熟悉的几个调试命令!这次先看下pmap
—————————————————————
补充:
貌似ps av 进程号也可以看某进程的内存
ps av
PID TTY STAT TIME MAJFL TRS DRS RSS %MEM COMMAND
4142 tty4 Ss+ 0:00 0 10 1637 508 0.0 /sbin/getty 38400 tty4
4143 tty5 Ss+ 0:00 0 10 1637 508 0.0 /sbin/getty 38400 tty5
TRS代表程序所拥有的可执行虚拟内存的大小 DRS代表程序数据段和用户态的栈的大小 RSS代边当前任务驻留物理地址空间的大小
man ps 看看它们的含义:
rss RSS resident set size, the non-swapped physical memory that a task has used (in kiloBytes). (alias rssize, rsz).
vsz VSZ virtual memory size of the process in KiB (1024-byte units). Device mappings are currently excluded; this is subject to change. (alias vsize).
简单一点说,RSS 就是这个process 实际占用的物理内存,VSZ 就是process 的虚拟内存,就是process 现在没有使用但未来可能会分配的内存大小。
其实这里的ps 出来的结果,是有点不正确的,如果把所有程序的 RSS 加起来,恐怕比你的实际内存还要大呢。为什么呢?因为 ps 的结果,RSS 那部分,是包括共享内存的。这里我用 pmap 来看看。
1980
1980: /usr /bin /testaa
Address Kbytes Mode Offset Device Mapping
00 2524 r-x– 0000000000000000 008:00002 libkio.so.5.3.0
00 4 —– 0000000000 008:00002 libkio.so.5.3.0
00 32 r—- 0000000000 008:00002 libkio.so.5.3.0
00 16 rw— 000000000027f000 008:00002 libkio.so.5.3.0
00 444 r-x– 0000000000000000 008:00002 libQtDBus.so.4.5.2
00 4 —– 000000000006f000 008:00002 libQtDBus.so.4.5.2
00 4 r—- 000000000006f000 008:00002 libQtDBus.so.4.5.2
00 4 rw— 0000000000070000 008:00002 libQtDBus.so.4.5.2
00 228 r-x– 0000000000000000 008:00002 libkparts.so.4.3.0
00 8 r—- 0000000000039000 008:00002 libkparts.so.4.3.0
00 4 rw— 000000000003b000 008:00002 libkparts.so.4.3.0
00 3552 r-x– 0000000000000000 008:00002 libkdeui.so.5.3.0
007bb000 76 r—- 0000000000 008:00002 libkdeui.so.5.3.0
007ce000 24 rw— 000000000038a000 008:00002 libkdeui.so.5.3.0
007d4000 4 rw— 0000000000000000 000:00000 [ anon ]
….
mapped: K writeable /private: 19208K shared: 20544K
我略去了一部分输出,都是差不多的,重点在最后那行输出。
linux 会把一些shared libraries 载入到内存中,在pmap 的输出中,这些shared libraries 的名字通常是 lib*.so 。如 libX11.so.6.2.0 。这个 libX11.so.6.2.0 会被很多process load 到自己的运行环境中,同时,ps 输出的RSS 结果中,每个process 都包含了这个libX11.so.6.2.0 ,而事实上它只被load 了一次,如果单纯把ps 的结果相加,这样就重复计算了。
而 pmap 的输出中,writeable/private: 19208K ,这个就是testaa 这个程序真正占用的物理内存,不包含shared libraries 。在这里,它只有19208K,而ps 的RSS 是34416K。
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/199696.html原文链接:https://javaforall.net
