编写Linux C++程序如何影响VIRT(虚存)和RES(实存/常驻内存)
转载目的,主要是为了理解lVIRT虚拟内存、RES常驻内存、共享内存SHR、SWAP和实际程序应用如何对应的。
在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后,它将会降下来。
SWAP:
只有当物理内存耗尽时才会使用到,linux的swap原则是尽量使用物理内存。
测试如下:
一)
- #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多线程实践(10) --使用 C++11 编写 Linux 多线程程序
在这个多核时代,如何充分利用每个 CPU 内核是一个绕不开的话题,从需要为成千上万的用户同时提供服务的服务端应用程序,到需要同时打开十几个页面,每个页面都有几十上百个链接的 web 浏览器应用程序,从 ...
- 使用C++编写linux多线程程序
前言 在这个多核时代,如何充分利用每个 CPU 内核是一个绕不开的话题,从需要为成千上万的用户同时提供服务的服务端应用程序,到需要同时打开十几个页面,每个页面都有几十上百个链接的 web 浏览器应用程 ...
- [转]使用 C++11 编写 Linux 多线程程序
前言 在这个多核时代,如何充分利用每个 CPU 内核是一个绕不开的话题,从需要为成千上万的用户同时提供服务的服务端应用程序,到需要同时打开十几个页面,每个页面都有几十上百个链接的 web 浏览器应用程 ...
- linux top命令看到的实存(RES)与虚存(VIRT)分析
近期在公司中解决程序使用的内存高问题,将一部分之前无法回收的内存进行了回收,实现降内存效果(降实存). 在统计效果时, QA问是统计RES(实存)还是VIRT(虚存). 在网上学习看了一些博客,这里自 ...
- 为 Linux 应用程序编写 DLL[转]
自:http://www.ibm.com/developerworks/cn/linux/sdk/dll/index.html 在仅仅只会编写插件的时候为什么要编写整个应用程序? 插件和 DLL 通常 ...
- 闲来瞎扯 -- 在vs2008下编写linux程序
虽说vim很强大,但是个人感觉器代码提示功能不如visual assist来的强大.如何使用visual assist来实现代码的提示功能呢? 首先说明我的环境 : 宿主机是xp(O(∩_∩)O~还是 ...
- 使用VS2017 编写Linux系统上的Opencv程序
背景 之前写图像算法的程序都是在window10下使用VS编写,VS这个IDE结合“ImageWatch.vsix“插件,用于调试opencv相关的图像算法程序十分方便.后因项目需要,需将相关程序移植 ...
- Linux 虚存的性能问题
虚存子系统是所有 UNIX 系统的核心组件.下面讨论虚存系统的实现及其对操作系统中几乎其他所有子系统的作用和影响.首先详细说明一些基本的内存管理问题:然后具体分析 Linux 操作系统如何实施虚存管理 ...
- Python编写守护进程程序
Python编写守护进程程序思路 1. fork子进程,父进程退出通常,我们执行服务端程序的时候都会通过终端连接到服务器,成功连接后会加载shell环境,终端和shell都是进程,shell进程是终端 ...
随机推荐
- 判断字符串a和b是否互为旋转词
旋转词:把字符串str的任意部分移动到后面形成的新字符串叫做字符串str的旋转词. 比如abc的旋转词有 abc,acb,cba,... 判断str1和str2是否互为旋转词,其最优解可以是时间复杂度 ...
- 使用Redis作为分布式锁的一些注意点
Redis实现分布式锁 最近看分布式锁的过程中看到一篇不错的文章,特地的加工一番自己的理解: Redis分布式锁实现的三个核心要素: 1.加锁 最简单的方法是使用setnx命令.key是锁的唯一标识, ...
- loadrunner脚本优化-ParameterList参数类型介绍
脚本优化-Parameter List参数类型介绍 by:授客 QQ:1033553122 篇幅问题,这里采用网盘下载的方式和大家分享: 百度网盘分享: 链接: http://pan.baidu.co ...
- 学习用Node.js和Elasticsearch构建搜索引擎(5):mac本机部署canal
1.背景介绍 最近做的一个项目需要快速检索数据,经过商讨后采用了ElasticSearch作为快速检索数据引擎,但是数据如何同步到ES中是个问题,我们最开始计划了定时任务.mysql trigger等 ...
- linux 下svn操作
* 前言: linux下的svn相比于gitlab,配置要求第一点:gitlab需要4G的内存,如果使用swap+内存的替代方案,理论上是可行的,但是实际操作中各种坑: 所以,由于条件限制,使 ...
- 记录一次spark连接mysql遇到的问题
版权声明:本文为博主原创文章,未经博主允许不得转载 在使用spark连接mysql的过程中报错了,错误如下 08:51:32.495 [main] ERROR - Error loading fact ...
- 设计模式java----单例模式
一.懒汉式单例 在第一次调用的时候实例化自己,Singleton的唯一实例只能通过getInstance()方法访问.线程不安全 /** * Created by Admin on 2017/3/19 ...
- C#面向对象 类的封装
class student { public int _code; public int Code//属性 { //获取值 get { ; } //设置值 set { _code = value + ...
- 初学ubuntu命令
将我第一天学的内容做个笔记 ,方便日后查看 命令的使用: ls ls -a 显示所有文件 ls -l 显示文件的所有信息 cp 注意命令格式 /home/../temp/a /ho ...
- jQuery入门(1)
1.了解jQuery与JavaScript的区别 css --你的长相啦 Html --躯干 js --运动神经 jQuery就是对JavaScript的一个拓展,封装,就是让JavaScript更好 ...