半肾
精华
|
战斗力 鹅
|
回帖 0
注册时间 2007-12-28
|
又是你
我又没说,虚拟内存显示的就是实际使用的内存.
我是说,要看PF爆不爆,只需看虚拟内存那个栏位即可
对于一般用户而言,虚拟内存显示的那个栏位比内存显示的那个栏位更有参考价值.因为后面PF显示的都是虚拟内存,包括峰值等一系列数值
你这个人真较真
有时候,发现PF占用比较多,看虚拟内存那项比看内存占用那项更靠谱,停止掉那项,PF就降低相应数值的PF占用.
这个是对一般用户最有效的
别在文字上较真,你真有心,给大家普及普及,别在这叫
zmw_831110 发表于 2010/2/7 20:00 
首先解释一下虚拟内存是什么。
一个常见的误解是虚拟内存是内存不足,把硬盘上的空间虚拟一部分当作内存使用。但事实远远不是这样。
虚拟内存,提供了一种机制分离虚拟的内存访问和实际的内存操作。让每个进程认为自己处于一个独立的4G的地址空间中。
然后解释一下操作系统的内存分配流程
当一个进程请求内存时,系统并不是直接把内存分配给这个进程,而是在操作系统用于管理进程的数据结构中做做修改,标出“某某地方(虚拟地址)的内存已经可以给该进程使用”。当进程真的访问这个地址时,操作系统才会把内存实际分配给它。
接下来解释一下XP taskmgr中的那个虚拟内存大小
那个虚拟内存大小,就是上面提到的“某某虚拟内存区已经可以给该进程使用”的总大小。至于该进程到底用了多少,消耗了多少系统资源,和这个“虚拟内存大小”关系不大。
实验:
#include <malloc.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i = 0;
for(; i < 18; i++)
{
void *ptr = malloc(1024*1024*512); // 512MB
printf(\\"%ld\\n\\", ptr);
}
system(\\"pause\\");
return 0;
}
若想获得下文提到的戏剧性效果,请最好使用64位VC9编译器编译,并在64位Windows操作系统下运行此程序
测试环境Windows 7 x64 Ent.
Mem:2G
Page file:2G(managed by system)
结果如图。




由于我用的是Win7x64,它的taskmgr中已经没有“虚拟内存大小”这一栏了,故使用ProcessExplorer代替。
从ProcessExplorer中可以看到一个很可笑的虚拟内存大小:4.5G,这甚至超过了我的物理内存+页面文件总大小。
另外一方面,taskmgr给出的值就十分正常。
还有一个问题,这种情况是否常见?
分配一大块内存,但不立刻使用的情况还是比较多的,当程序想要自己管理内存,进行特化的内存分配处理时就会出现——通用的内存管理函数并不一定是最合适的。
最后回到正题,这个值有没有参考意义?
对于Firefox,答案是“有一些”,据我(很久之前了,如上文所提Windows 7的taskmgr已经没有这个容易造成混乱的值可看了)观察,Firefox的实际内存消耗和“虚拟内存大小”是正相关的。 |
|