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下来的、类似还只是一张支票.
VIRT表示进程所有内存,包括已申请未使用的部分。在申请10GB内存但未使用时,VIRT显示10GB,RES较小。随着内存实际使用,RES会逐渐增加到10GB。释放5GB内存时,VIRT相应减少。因此,评估进程内存使用应关注RES和SWAP,因为VIRT仅反映已申请内存,不都实际分配。

991

被折叠的 条评论
为什么被折叠?



