在Linux命令行中執行top命令,能夠查詢到全部進程使用的VIRT虛擬內存、RES常駐內存和共享內存SHR。ios
那麼,什麼是VIRT虛擬內存、RES常駐內存和共享內存SHR?咱們編寫的Linux C++程序如何影響它們呢?函數
VIRT:測試
一、進程「須要的」虛擬內存大小,包括進程使用的庫、代碼、數據,以及malloc、new分配的堆空間和分配的棧空間等;spa
二、假如進程新申請10MB的內存,但實際只使用了1MB,那麼它會增加10MB,而不是實際的1MB使用量。命令行
三、VIRT = SWAP + REScode
RES:進程
一、進程當前使用的內存大小,包括使用中的malloc、new分配的堆空間和分配的棧空間,但不包括swap out量;內存
二、包含其餘進程的共享;get
三、若是申請10MB的內存,實際使用1MB,它只增加1MB,與VIRT相反;io
四、關於庫佔用內存的狀況,它只統計加載的庫文件所佔內存大小。
五、RES = CODE + DATA
SHR:
一、除了自身進程的共享內存,也包括其餘進程的共享內存;
二、雖然進程只使用了幾個共享庫的函數,但它包含了整個共享庫的大小;
三、計算某個進程所佔的物理內存大小公式:RES – SHR;
四、swap out後,它將會降下來。
測試以下:
#include <iostream> int main() { char * p = new char [1024*1024*512]; getchar(); return 0; }
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中,並不在內容中真實的分配物理內存。
#include <iostream> int main() { char * p = new char [1024*1024*512]; memset(p, 0, 1024*1024*512); getchar(); return 0; }
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出來的空間被使用後,會真實分配物理內存。