当程序运行一段时间后,发现物理内存占用不高,但虚拟内存占用太高,导致运行久了无法再申请更多虚拟内存(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提示我参数不正确,不知道该怎么用
}
进程的虚拟内存的状态有:自由的、保留的和已提交的虚拟内存;一般来说要调用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提示我参数不正确,不知道该怎么用
}
解决方案 »
- 一个lib工程怎么生成不了.lib的文件啊 ??
- UDP 收不到数据.
- 怎样从msi安装文件中删除一个文件
- [求助]如何知道对方的socket连接已经关闭了?
- 怎样把VC写的程序弄成一个文件,拿到一部没装VC的机器上运行?
- Winsock接收单片机发来的数据出现了乱码
- MFC中在一个窗口控制另一个窗口的按钮
- 求一算法~~~寻找2个字符串中相同子串的个数。。
- 关于CListCtrl类对象的创建销毁问题
- 我为IE写一个ActiveX控件,想要读取HTML文件中的PARAM NAME="..." VALUE="..."参数,大虾请进!!!
- CListView能否实现资源管理器的分组功能?
- 对话框中嵌套对话框实现
“多进程”,也是程序的一种模式,关闭不需要的进程,就可以节省出大量的系统资源。传统Unix服务器都是多进程模式。
降低虚存使用量的唯一办法,就是少用内存,少用内存有很多手段:1. 降低程序使用量:
比如,我需要使用1000个整数的数组,现在我只用10个整数的数组,这样就少用了内存,但是,1000个整数的数组可以存储一个小学里小学生的索引信息,而现在只有一个兴趣小组的学生的索引信息了。但数据不在多,而在于精,这10个学生可能都是对社会有用的人,而那1000个学生可能都是碌碌无为之辈。2. 尽量使用磁盘操作:
系统的一些低级API不会给用户程序隐式加缓存,这样就可以“实际地”读/写磁盘,比如1000个整数,你可以完全存在磁盘上,用到哪个,再将其中某个读出来。这样可以充分体现出海量存储器的益处。3. 尽量不使用GUI:
图形界面会浪费大量内存,我建议不要使用GUI,输出就写日志,输入就通过管道或者文件输入,或者通过计算机行业的老传统,使用磁带或者读卡机,将程序以带孔的卡片形式保存,然后用读卡器输入机器。以前的机器内存只有几10KB,照样能干很多事情。4. 降低虚存的釜底抽薪之计:
使用实模式而不使用保护模式的操作系统,这样的系统有比如DOS系统,VxWorks等,实为广大人民群众喜闻乐见的内存使用方式,没有虚拟内存,当然也就不存在降低虚拟内存之说。
要降低虚拟内存使用,方法就是优化你的数据结构和算法,和消除内存泄漏。
如果windows设置成系统管理页面文件,它会根据使用情况自动增加交换空间