编写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进程是终端 ...
随机推荐
- Keystone, Start, Failed to Load Bson
If you have installed the Keystone.js, and properly installed mongodb, but when tried to start the k ...
- Play 2D games on Nexus 6P running Android N7.1.1 with Daydream View VR headset
http://files.cnblogs.com/files/we-hjb/N6P_Android7_SBS_SF.rar
- 【Spring源码解读】bean标签中的属性
说明 今天在阅读Spring源码的时候,发现在加载xml中的bean时,解析了很多标签,其中有常用的如:scope.autowire.lazy-init.init-method.destroy-met ...
- 章节七、4-Sets
一.set中不允许存在相同的元素 package ZangJie7; import java.util.ArrayList; import java.util.HashSet; import java ...
- SQL SERVER LINUX
以前在Linux平台上访问SQL Server时常用的方式有:http://www.freetds.org/https://sourceforge.net/projects/jtds/这方面的资料已经 ...
- 手把手教你全家桶之React(三)--完结篇
前言 本篇主要是讲一些全家桶的优化与完善,基础功能上一篇已经讲得差不多了.直接开始: Source Maps 当javaScript抛出异常时,我们会很想知道它发生在哪个文件的哪一行.但是webpac ...
- ConcurrentDictionary与Dictionary 替换
本文导读:ASP.NET中ConcurrentDictionary是.Net4 增加的,相对于Dictionary的线程安全的集合, ConcurrentDictionary可实现一个线程安全的集合, ...
- C#-泛型类型(十六)
概述 泛型类和泛型方法兼具可重用性.类型安全性和效率,这是非泛型类和非泛型方法无法实现的 泛型通常与集合以及作用于集合的方法一起使用 泛型所属命名空间:System.Collections.Gener ...
- linux 命令之netstat
转自:http://www.maomao365.com/?p=699 linux 命令之netstat 在linux中netstat命令的作用是查看TCP/IP网络当前所开放端口,所对应的本地和外地端 ...
- C#核心基础--类的声明
C#核心基础--类的声明 类是使用关键字 class 声明的,如下面的示例所示: 访问修饰符 class 类名 { //类成员: // Methods, properties, fields, eve ...