当程序运行一段时间后,发现物理内存占用不高,但虚拟内存占用太高,导致运行久了无法再申请更多虚拟内存(storage)就挂掉了。就问题本身而言,我不关心是否是内存泄漏,或者其他导致的原因,而只关心一个虚拟内存很高的进程能否使之降低。我找了一些资料,发现操作虚拟内存的一些函数:VirtualAlloc 、VirtualFree 、VirtualQuery 、VirtualQueryEx 等;
进程的虚拟内存的状态有:自由的、保留的和已提交的虚拟内存;一般来说要调用VirtualAlloc来分配虚拟内存后,再调用VirtualFree来释放,但我想能否对进程已有的虚拟内存通过VirtualQuery 来枚举出来,再调用VirtualFree来释放呢?
我不太知道该怎么写,写了下面一段,运行有问题, BOOL bRes = TRUE;
DWORD dwAddr = 0;
MEMORY_BASIC_INFORMATION mbi;
while (bRes)//这个循环竟会一直运行,是个死循环
{
bRes = VirtualQuery(&dwAddr,&mbi,sizeof(mbi));
dwAddr=(DWORD)mbi.BaseAddress+mbi.RegionSize; VirtualFree((LPBYTE)dwAddr,0,MEM_RELEASE);//这里watch里面的$err,hr提示我参数不正确,不知道该怎么用
}

解决方案 »

  1.   

    你应该分析你的代码,是否有内存泄漏,new了是否delete,其他申请的资源是否释放
      

  2.   

    请使用ExitProcess释放进程所有虚存。
      

  3.   


    “多进程”,也是程序的一种模式,关闭不需要的进程,就可以节省出大量的系统资源。传统Unix服务器都是多进程模式。
      

  4.   


    降低虚存使用量的唯一办法,就是少用内存,少用内存有很多手段:1. 降低程序使用量:  
        比如,我需要使用1000个整数的数组,现在我只用10个整数的数组,这样就少用了内存,但是,1000个整数的数组可以存储一个小学里小学生的索引信息,而现在只有一个兴趣小组的学生的索引信息了。但数据不在多,而在于精,这10个学生可能都是对社会有用的人,而那1000个学生可能都是碌碌无为之辈。2. 尽量使用磁盘操作:
        系统的一些低级API不会给用户程序隐式加缓存,这样就可以“实际地”读/写磁盘,比如1000个整数,你可以完全存在磁盘上,用到哪个,再将其中某个读出来。这样可以充分体现出海量存储器的益处。3. 尽量不使用GUI:
       图形界面会浪费大量内存,我建议不要使用GUI,输出就写日志,输入就通过管道或者文件输入,或者通过计算机行业的老传统,使用磁带或者读卡机,将程序以带孔的卡片形式保存,然后用读卡器输入机器。以前的机器内存只有几10KB,照样能干很多事情。4. 降低虚存的釜底抽薪之计:
       使用实模式而不使用保护模式的操作系统,这样的系统有比如DOS系统,VxWorks等,实为广大人民群众喜闻乐见的内存使用方式,没有虚拟内存,当然也就不存在降低虚拟内存之说。
     
      

  5.   

    你怎么知道哪些区域是没有用的?
    要降低虚拟内存使用,方法就是优化你的数据结构和算法,和消除内存泄漏。
    如果windows设置成系统管理页面文件,它会根据使用情况自动增加交换空间
      

  6.   

    有种办法可以尝试   但需要根据实际情况   HOOK 虚拟内存申请函数   从而对所有申请的过程进行分析确定,  程序建立一个内存队列     申请函数HOOk以后对此队列循环分配      这样的控制需要根据实际来确定       你看着办吧    如果只是别人的程序循环申请而不懂得释放   这种方式应该完完全全能够避免      如果是虚拟内存占用一直过早   那么你就要检测是否为读入文件和操作临时缓存   HOOK 能够检测出你虚拟内存分配溢出的异常状态