Memory 另一个内存泄漏问题

Memory 另一个内存泄漏问题,memory,memory-leaks,Memory,Memory Leaks,我的应用程序持续运行4到6个小时,在此期间内存没有持续增加或类似的情况 4到6个小时后,我开始出现内存异常。即使在那个时候,根据TaskManager,3GB内存中也只有900MB被使用。而应用程序本身使用的内存也不超过200MB 那我为什么要从记忆错误中解脱出来呢 这是否意味着内存泄漏不一定在任务管理器中可见 Regagards这可能是由内存碎片引起的。当应用程序运行很长时间时,内存可能会被分割,这意味着它会被许多小的分配块和空闲空间填满。如果要分配大于最大可用块的内存块,则分配将失败,即使可

我的应用程序持续运行4到6个小时,在此期间内存没有持续增加或类似的情况

4到6个小时后,我开始出现内存异常。即使在那个时候,根据TaskManager,3GB内存中也只有900MB被使用。而应用程序本身使用的内存也不超过200MB

那我为什么要从记忆错误中解脱出来呢

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


Regagards

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

您可能还想检查您是否无意中在某一点分配了一个巨大的内存块


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

使用Process Explorer而不是Task Manager查看应用程序的内存消耗

  • Private Bytes:是应用程序使用的内存量。这也是任务管理器在VM大小列(XP下)中显示的值
  • 虚拟内存大小:这是应用程序当前使用的最大地址。此值限制为2 GB(对于32位操作系统中的32位应用程序)
私有字节和虚拟内存大小之间的差异是由内存碎片引起的。对此,您唯一能做的就是使用内存管理器来减少碎片,例如使用内存池

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


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

语言?平台?任务管理器会暗示Windows,但如果我懂这种语言,那就见鬼了。EOutOfMemoryError的唯一功能是在线和Delphi上的一些拼写错误。考虑到我们朋友对“问候”的拼写,我将使用打字错误和Java。想开始一个赌注池吗?我敢赌C++。我做了一些法医工作(AHEM,他最后的问题是关于C++ Builder)。