转载目的,主要是为了理解lVIRT虚拟内存、RES常驻内存、共享内存SHR、SWAP和实际程序应用如何对应的。linux
在Linux命令行中执行top命令,能够查询到全部进程使用的VIRT虚拟内存、RES常驻内存和共享内存SHR。ios
那么,什么是VIRT虚拟内存、RES常驻内存和共享内存SHR?咱们编写的Linux C++程序如何影响它们呢?服务器
查阅资料后,概括一下。函数
VIRT:测试
一、进程“须要的”虚拟内存大小,包括进程使用的库、代码、数据,以及malloc、new分配的堆空间和分配的栈空间等;spa
二、假如进程新申请10MB的内存,但实际只使用了1MB,那么它会增加10MB,而不是实际的1MB使用量。.net
三、VIRT = SWAP + RES
命令行
RES:blog
一、进程当前使用的内存大小,包括使用中的malloc、new分配的堆空间和分配的栈空间,但不包括swap out量;进程
二、包含其余进程的共享;
三、若是申请10MB的内存,实际使用1MB,它只增加1MB,与VIRT相反;
四、关于库占用内存的状况,它只统计加载的库文件所占内存大小。
五、RES = CODE + DATA
SHR:
一、除了自身进程的共享内存,也包括其余进程的共享内存;
二、虽然进程只使用了几个共享库的函数,但它包含了整个共享库的大小;
三、计算某个进程所占的物理内存大小公式:RES – SHR;
四、swap out后,它将会降下来。
SWAP:
只有当物理内存耗尽时才会使用到,linux的swap原则是尽可能使用物理内存。
测试以下:
一)
top结果以下:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
401 huyiyang 17 0 523m 916 792 S 0.0 0.0 0:00.00 ./main
VIRT包含了new出来的512MB空间,可是RES不包含该空间。即刚new出来的空间,若是没有使用,会放入SWAP中,并不在内容中真实的分配物理内存。
二)
top结果以下:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
32604 huyiyang 17 0 523m 512m 792 S 0.0 26.2 0:00.33 ./main
VIRT包含new出来的512MB空间,RES包含目前使用的memset的512M空间。即new出来的空间被使用后,会真实分配物理内存。
三)
top结果以下:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
456 huyiyang 17 0 523m 128m 792 S 0.0 6.6 0:00.07 ./main
VIRT包含new出来的512MB空间,RES包含目前使用的memset的128M空间。即new出来的空间,若是只使用部分,则只分配部分物理内存。
四)
top结果以下:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
544 huyiyang 17 0 21568 884 760 S 0.0 0.0 0:00.00 ./main
没有使用的栈空间,VIRT会包含(没有使用的栈空间会在SWAP中)。
五)
top结果以下:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
561 huyiyang 17 0 21568 10m 760 S 0.0 0.6 0:00.00 ./main
已经使用的栈空间,VIRT和RES都会包含。
六)
第一个循环时:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ SWAP COMMAND
3627 huyiyang 18 0 523m 512m 836 S 0.0 26.2 0:00.34 10m ./main
第二个循环时:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ SWAP COMMAND
3627 huyiyang 18 0 1035m 1.0g 836 S 0.0 52.4 0:00.69 10m ./main
第三个循环时:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ SWAP COMMAND
3627 huyiyang 18 0 1547m 1.5g 836 S 0.0 78.5 0:01.03 10m ./main
在个人服务器上,当执行到第四个循环时,而且有其余程序占用较大内存的状况下,top结果以下:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ SWAP COMMAND
3427 huyiyang 16 0 2059m 711m 836 S 0.0 36.4 0:01.45 1.3g ./main
出现了swap out的状况。