Linux Top

VIRT,RES,SHR,虛擬內存和物理內存

在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出來的空間被使用後,會真實分配物理內存。

相關文章
相關標籤/搜索