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出来的空间被使用后,会真实分配物理内存。

相关文章
相关标签/搜索