我的应用程序会持续运行4到6个小时,在此期间不会持续增加内存或任何类似的东西。
然后,4到6个小时后,我开始收到EOutofMemory异常。即使在那个时候,每个任务管理器也只使用了3GBRAM中的900MB。并且应用程序本身使用的内存不超过200MB。
那么为什么我会收到EOoutofMEmory错误?
这是否意味着内存泄漏在任务管理器中不一定可见?
Regagards
发布于 2010-05-30 19:59:35
使用Process Explorer而不是Task Manager来查看应用程序的内存消耗。
私有字节和虚拟内存大小的不同是由内存碎片引起的。你唯一能做的就是使用内存管理器来减少碎片,比如使用内存池。
DougLea内存管理器是一个免费的替代方案。也有商业内存管理器。您还可以尝试编写自己的内存管理器(这并不难:您只需覆盖new和delete操作符)。
还有一些技巧可以提高2 GB的限制。如果你用/LARGEADDRESSAWARE标志链接你的应用程序,你的应用程序将能够分配3 3GB的内存(如果XP是用/3GB标志启动的,对于Vista/W7可能有一个类似的标志,但我不知道这个)。在64位操作系统上,LargeAddressAware可执行文件甚至可以使用多达4 GB的内存。
发布于 2010-05-30 17:43:28
这可能是由内存碎片引起的。当应用程序长时间运行时,内存可能会被碎片化,这意味着它被许多小的已分配块和空闲空间所填充。如果要分配大于最大可用块的内存块,则分配将失败,即使可用空间总量表明有足够的内存可以成功分配也是如此。
您可能还想检查一下,您是否在某个时刻无意中尝试分配了大量内存块。
我建议您检查失败的分配的大小。
https://stackoverflow.com/questions/2938091
复制相似问题