VIRT:进程所有内存;注意这里包括了申请但是还没使用的,比如:
step1:
// arr_size=10
void alloc(char** p, int arr_size) {
for (int i = 0; i < arr_size; i++) {
int size = 1024*1024*1024;
p[i] = (char*)malloc(size);
if (p[i] == NULL) {
cout<<"malloc failed!"<<endl;
exit(-1);
}
}
}
这里申请了10G内存,但是没有使用,所以观察进程RES并没有增长10G,也就是这10G给内核说我要、但是我还没用,那么内核肯定不会傻啦吧唧的就直接开辟10G空间给你用,肯定是你要用的时候才给你分配;
此时VIRT显示10G,但res很小
step2:
// arr_size
void use(char** p, int arr_size) {
for(int i = 0; i < arr_size; i++) {
int size = 1024*1024*1024;
for(int j = 0; j < size; j++) {
p[i][j] = '0';
}
}
}
这个时候观察进程的内存使用,发现RES会逐渐攀升到10g
step3:
调用free释放5个G,那么VIRT减少5G
// free_arr_size=5
void free(char** p, int free_arr_size) {
for(int i = 0; i < free_arr_size; i++) {
free(p[i]);
}
}
所以:
查看进程使用的内存,还是应该看RES和SWAP,因为VIRT中包含了进程申请但是还没使用的内存、这部分内存内核当然是不会分配page下来的、类似还只是一张支票.