编写Linux C++程序如何影响VIRT(虚存)和RES(实存/常驻内存)
来源:互联网 发布:数据口径是什么意思 编辑:程序博客网 时间:2024/06/05 20:33
转载地址 : http://blog.csdn.net/huyiyang2010/article/details/7815491
在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空间,但是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出来的空间被使用后,会真实分配物理内存。
三)
#include <iostream> int main() { char * p = new char [1024*1024*512]; memset(p + 1024*1024*128, 0, 1024*1024*128); getchar(); return 0; }
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出来的空间,如果只使用部分,则只分配部分物理内存。
四)
#include <iostream> int main() { char p[1024*1024*10]; getchar(); return 0; }
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中)。
五)
#include <iostream> int main() { char p[1024*1024*10]; memset(p, 0, 1024*1024*10); getchar(); return 0; }
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都会包含。
六)
#include <iostream> int main() { char ** pp = new char * [1024]; for(int i=0;i<1024;i++) { pp[i] = new char [1024*1024*512]; memset(pp[i], 0, 1024*1024*512); printf("p%d\n", i); getchar(); } return 0; }
第一个循环时:
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的情况。
- 编写Linux C++程序如何影响VIRT(虚存)和RES(实存/常驻内存)
- 编写Linux C++程序如何影响VIRT(虚存)和RES(实存/常驻内存)
- 编写Linux C++程序如何影响VIRT(虚存)和RES(实存/常驻内存)
- 程序如何影响VIRT(虚存)和RES(实存/常驻内存)
- linux top 命令---VIRT,RES,SHR,虚拟内存和物理内存(
- linux下的内存查看(virt,res,shr,data的意义)
- linux下的内存查看(virt,res,shr,data的意义)
- linux top:virt res 内存变化
- VIRT,RES,SHR,虚拟内存和物理内存
- 如何为linux释放内存和缓存
- Linux 下C语言学习(四)——变量的类型和程序各部分代码在内存中的位置
- linux top VIRT RES SHR SWAP DATA内存参数详解
- linux top VIRT RES SHR SWAP DATA内存参数详解
- linux top VIRT RES SHR SWAP DATA内存参数详解
- Linux top VIRT RES SHR SWAP DATA内存参数详解
- Linux top VIRT RES SHR SWAP DATA内存参数详解
- linux top VIRT RES SHR SWAP DATA内存参数详解
- C For Linux之内存访问-内存简介
- 获取IP
- 个人理解:import scipy语句 为什么不能导入 scipy.misc.imsave 模块
- Linux 硬盘扩充操作 pv lv
- android控件 ToggleButton的应用
- 防止链接注入( XSS跨站脚本攻击)、跨站点脚本编制
- 编写Linux C++程序如何影响VIRT(虚存)和RES(实存/常驻内存)
- 理解矩阵乘法
- xml序列化/反序列化
- [iOS]详解枚举NS_ENUM与NS_OPTIONS的区别与说明
- 怎样查看oracle当前的连接数
- 集成ARoute出现异常“There is no route match the path”
- 数据库自增字段解决方案
- 移动开发如何选择正确的框架
- 微信扫码输入金额付款解决方案,微信扫二维码输入金额支付原理,微信扫描二维码输入金额付款。微信公众号扫码输入金额付款