另一个内存泄漏问题

时间:2010-05-30 09:30:11

标签: memory memory-leaks

我的应用程序持续运行4到6个小时,在此期间内存或任何类似的内容都没有连续增加。

然后在4到6小时后,我开始获得EOutofMemory Exceptions。即便如此,每个任务管理器使用的3GB RAM也只有900MB。而且应用程序本身的使用量不超过200MB。

那我为什么会收到EOoutofMEmory错误?

是否意味着内存泄漏在任务管理器中不一定可见?

Regagards

2 个答案:

答案 0 :(得分:1)

使用Process Explorer而不是任务管理器来查看应用程序的内存消耗。

  • Private Bytes:是您的应用程序使用的内存量。这也是“任务管理器”在“VM大小”列(在XP下)
  • 中显示的值
  • 虚拟内存大小:这是您的应用程序当前使用的最大地址。此值受2 GB限制(对于32位操作系统中的32位应用程序)。

专用字节和虚拟内存大小之间的差异是由内存碎片引起的。你唯一能做的就是使用一个试图减少碎片的内存管理器,例如:通过使用内存池。

DougLea内存管理器是一个免费的替代方案。还有商业内存管理器。您也可以尝试编写自己的内存管理器(这并不难:您只需要覆盖new和delete操作符)。

还有一些技巧可以增加2 GB的限制。如果你的应用程序与/ LARGEADDRESSAWARE标志链接,你的应用程序将能够分配3GB内存(如果XP使用/ 3GB标志启动,对于Vista / W7,可能有类似的标志,但我不知道这一点)。在64位操作系统上,LargeAddressAware可执行文件甚至可以使用最多4 GB的内存。

答案 1 :(得分:0)

这可能是由内存碎片引起的。当应用程序运行很长时间时,内存可能会碎片化,这意味着它被许多小的已分配块和空闲空间填充。如果要分配大于最大空闲块的内存块,则分配将失败,即使可用空间总量表明有足够的内存可以使分配成功。

您可能还想检查一下是否意外尝试分配大量内存。

我建议您检查失败的分配大小。