我的应用程序持续运行4到6个小时,在此期间内存或任何类似的内容都没有连续增加。
然后在4到6小时后,我开始获得EOutofMemory Exceptions。即便如此,每个任务管理器使用的3GB RAM也只有900MB。而且应用程序本身的使用量不超过200MB。
那我为什么会收到EOoutofMEmory错误?
是否意味着内存泄漏在任务管理器中不一定可见?
Regagards
答案 0 :(得分:1)
使用Process Explorer而不是任务管理器来查看应用程序的内存消耗。
专用字节和虚拟内存大小之间的差异是由内存碎片引起的。你唯一能做的就是使用一个试图减少碎片的内存管理器,例如:通过使用内存池。
DougLea内存管理器是一个免费的替代方案。还有商业内存管理器。您也可以尝试编写自己的内存管理器(这并不难:您只需要覆盖new和delete操作符)。
还有一些技巧可以增加2 GB的限制。如果你的应用程序与/ LARGEADDRESSAWARE标志链接,你的应用程序将能够分配3GB内存(如果XP使用/ 3GB标志启动,对于Vista / W7,可能有类似的标志,但我不知道这一点)。在64位操作系统上,LargeAddressAware可执行文件甚至可以使用最多4 GB的内存。
答案 1 :(得分:0)
这可能是由内存碎片引起的。当应用程序运行很长时间时,内存可能会碎片化,这意味着它被许多小的已分配块和空闲空间填充。如果要分配大于最大空闲块的内存块,则分配将失败,即使可用空间总量表明有足够的内存可以使分配成功。
您可能还想检查一下是否意外尝试分配大量内存。
我建议您检查失败的分配大小。