程序的虚拟内存占用过高,能否将其降低?

上岸の鱼 2011-12-16 03:12:02
当程序运行一段时间后,发现物理内存占用不高,但虚拟内存占用太高,导致运行久了无法再申请更多虚拟内存(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提示我参数不正确,不知道该怎么用
}
...全文
2655 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
safeqq2 2011-12-17
  • 打赏
  • 举报
回复
有种办法可以尝试 但需要根据实际情况 HOOK 虚拟内存申请函数 从而对所有申请的过程进行分析确定, 程序建立一个内存队列 申请函数HOOk以后对此队列循环分配 这样的控制需要根据实际来确定 你看着办吧 如果只是别人的程序循环申请而不懂得释放 这种方式应该完完全全能够避免 如果是虚拟内存占用一直过早 那么你就要检测是否为读入文件和操作临时缓存 HOOK 能够检测出你虚拟内存分配溢出的异常状态
上岸の鱼 2011-12-17
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 lactoferrin 的回复:]
你怎么知道哪些区域是没有用的?
要降低虚拟内存使用,方法就是优化你的数据结构和算法,和消除内存泄漏。
如果windows设置成系统管理页面文件,它会根据使用情况自动增加交换空间
[/Quote]

好吧。。既然是无法去通过这种方式判断,那只有另寻他法了
Lactoferrin 2011-12-16
  • 打赏
  • 举报
回复
你怎么知道哪些区域是没有用的?
要降低虚拟内存使用,方法就是优化你的数据结构和算法,和消除内存泄漏。
如果windows设置成系统管理页面文件,它会根据使用情况自动增加交换空间
「已注销」 2011-12-16
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 xx7330842 的回复:]

我的目的是针对一个进程,想降低它的虚拟内存
[/Quote]

降低虚存使用量的唯一办法,就是少用内存,少用内存有很多手段:

1. 降低程序使用量:
比如,我需要使用1000个整数的数组,现在我只用10个整数的数组,这样就少用了内存,但是,1000个整数的数组可以存储一个小学里小学生的索引信息,而现在只有一个兴趣小组的学生的索引信息了。但数据不在多,而在于精,这10个学生可能都是对社会有用的人,而那1000个学生可能都是碌碌无为之辈。

2. 尽量使用磁盘操作:
系统的一些低级API不会给用户程序隐式加缓存,这样就可以“实际地”读/写磁盘,比如1000个整数,你可以完全存在磁盘上,用到哪个,再将其中某个读出来。这样可以充分体现出海量存储器的益处。

3. 尽量不使用GUI:
图形界面会浪费大量内存,我建议不要使用GUI,输出就写日志,输入就通过管道或者文件输入,或者通过计算机行业的老传统,使用磁带或者读卡机,将程序以带孔的卡片形式保存,然后用读卡器输入机器。以前的机器内存只有几10KB,照样能干很多事情。

4. 降低虚存的釜底抽薪之计:
使用实模式而不使用保护模式的操作系统,这样的系统有比如DOS系统,VxWorks等,实为广大人民群众喜闻乐见的内存使用方式,没有虚拟内存,当然也就不存在降低虚拟内存之说。
上岸の鱼 2011-12-16
  • 打赏
  • 举报
回复
我的目的是针对一个进程,想降低它的虚拟内存
「已注销」 2011-12-16
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 xx7330842 的回复:]

引用 8 楼 sinservice 的回复:
引用 7 楼 xx7330842 的回复:

请管理员删除6楼回复


一种意见,即使没有成为“普遍意见”,也不该被歧视对待。


不想多说什么,你自己清楚的,我只是想说要是以后有人看到你的回复,误以为可用,会浪费了他们的时间。
[/Quote]

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

上岸の鱼 2011-12-16
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 sinservice 的回复:]
引用 7 楼 xx7330842 的回复:

请管理员删除6楼回复


一种意见,即使没有成为“普遍意见”,也不该被歧视对待。
[/Quote]

不想多说什么,你自己清楚的,我只是想说要是以后有人看到你的回复,误以为可用,会浪费了他们的时间。
「已注销」 2011-12-16
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 xx7330842 的回复:]

请管理员删除6楼回复
[/Quote]

一种意见,即使没有成为“普遍意见”,也不该被歧视对待。
上岸の鱼 2011-12-16
  • 打赏
  • 举报
回复
请管理员删除6楼回复
「已注销」 2011-12-16
  • 打赏
  • 举报
回复
请使用ExitProcess释放进程所有虚存。
上岸の鱼 2011-12-16
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 oyljerry 的回复:]
在你非可控的地方,一个,不一定会允许你释放,其次,你释放了,可能引起程序崩溃
[/Quote]

你的意思是说虚拟内存中的部分都是有用的么?我是想把“自由的、保留的和已提交的虚拟内存”中自由的部分释放了,不知道这样会引起问题么?或者可行么?
oyljerry 2011-12-16
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 xx7330842 的回复:]
引用 2 楼 oyljerry 的回复:
你应该分析你的代码,是否有内存泄漏,new了是否delete,其他申请的资源是否释放


上面说过不想关心是否有内存泄漏的问题,因为我知道我写的代码部分没有泄漏,问题出在非我可控的部分上。我只想知道也重申一下: 一个程序的虚拟内存占用过高,能否将其降低
[/Quote]
在你非可控的地方,一个,不一定会允许你释放,其次,你释放了,可能引起程序崩溃
上岸の鱼 2011-12-16
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 oyljerry 的回复:]
你应该分析你的代码,是否有内存泄漏,new了是否delete,其他申请的资源是否释放
[/Quote]

上面说过不想关心是否有内存泄漏的问题,因为我知道我写的代码部分没有泄漏,问题出在非我可控的部分上。我只想知道也重申一下: 一个程序的虚拟内存占用过高,能否将其降低
oyljerry 2011-12-16
  • 打赏
  • 举报
回复
你应该分析你的代码,是否有内存泄漏,new了是否delete,其他申请的资源是否释放
上岸の鱼 2011-12-16
  • 打赏
  • 举报
回复
坐等高手回答

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧