在Linux命令行中执行top命令,可以查询到所有进程使用的VIRT虚拟内存、RES常驻内存和共享内存SHR。
那么,什么是VIRT虚拟内存、RES常驻内存和共享内存SHR?我们编写的Linux C++程序如何影响它们呢?
查阅资料后,归纳一下。
VIRT:
1、进程“需要的”虚拟内存大小,包括进程使用的库、代码、数据,以及malloc、new分配的堆空间和分配的栈空间等;
2、假如进程新申请10MB的内存,但实际只使用了1MB,那么它会增长10MB,而不是实际的1MB使用量。
3、VIRT = SWAP + RES
RES:
1、进程当前使用的内存大小,包括使用中的malloc、new分配的堆空间和分配的栈空间,但不包括swap out量;
2、包含其他进程的共享;
3、如果申请10MB的内存,实际使用1MB,它只增长1MB,与VIRT相反;
4、关于库占用内存的情况,它只统计加载的库文件所占内存大小。
5、RES = CODE + DATA
SHR:
1、除了自身进程的共享内存,也包括其他进程的共享内存;
2、虽然进程只使用了几个共享库的函数,但它包含了整个共享库的大小;
3、计算某个进程所占的物理内存大小公式:RES – SHR;
4、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空间,但是R

本文探讨了Linux系统中VIRT虚拟内存、RES常驻内存和SHR共享内存的概念,以及C++程序如何影响这些内存指标。VIRT包括代码、数据、堆栈和库;RES反映实际使用的物理内存,不包括交换空间;SHR是进程间的共享内存。通过测试案例展示了不同情况下VIRT和RES的变化,如未使用的堆空间会被放入交换空间,而栈空间的使用会影响VIRT和RES。
最低0.47元/天 解锁文章
1160

被折叠的 条评论
为什么被折叠?



