近期在公司中解决程序使用的内存高问题,将一部分之前无法回收的内存进行了回收,实现降内存效果(降实存)。
在统计效果时, QA问是统计RES(实存)还是VIRT(虚存)。
在网上学习看了一些博客,这里自己总结一下RES和VIRT的区别。
1. 概念
VIRT:
1 2 3 |
|
RES:
1 2 3 4 5 |
|
SHR:
1 2 3 4 |
|
2. 测试
(1) 使用堆分配内存, 进行测试:
1 #include <iostream> 2 #include <stdio.h> 3 #include <string.h> 4 5 int main() 6 { 7 int test = 0; 8 //分配512M, 未使用 9 char * p = new char [1024*1024*512]; 10 scanf("%d", &test); //等待输入 11 12 //使用10M 13 memset(p, 0, 1024 * 1024 * 10); 14 scanf("%d", &test); //等待输入 15 16 //使用50M 17 memset(p, 0, 1024 * 1024 * 50); 18 scanf("%d", &test); //等待输入 19 delete [] p; 20 return 0; 21 }
执行:
new 512M后,VIRT/RES
使用10M后,VIRT/RES
使用50M后,VIRT/RES
(2) 使用栈分配内存进行测试:
1 #include <iostream> 2 #include <stdio.h> 3 #include <string.h> 4 5 int main() 6 { 7 int test = 0; 8 //20M栈, 未使用 9 char p[1024*1024*20]; 10 scanf("%d", &test); //等待输入 11 12 //使用10M 13 memset(p, 0, 1024 * 1024 * 10); 14 scanf("%d", &test); //等待输入 15 return 0; 16 }
执行:
栈上申请20M
使用10M
3. 总结
堆、栈分配的内存,如果没有使用是不会占用实存的,只会记录到虚存。
如果程序占用实存比较多,说明程序申请内存多,实际使用的空间也多。
如果程序占用虚存比较多,说明程序申请来很多空间,但是没有使用。
工作中,遇到过有的程序虚存300G+, 实存只有不到15G。