【问题标题】:Another memory leak question另一个内存泄漏问题
【发布时间】:2010-05-30 09:30:10
【问题描述】:

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

然后在 4 到 6 小时后,我开始收到 EOutofMemory 异常。即使在那个时候,根据任务管理器,3GB RAM 中也只有 900MB 被使用。并且应用程序本身使用的空间不超过 200MB。

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

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

问候

【问题讨论】:

  • 语言?平台?
  • 任务管理器会暗示Windows,但如果我知道该语言,那就见鬼了。 EOutOfMemoryError 唯一的问题是在线和 Delphi 的一些拼写错误。鉴于我们朋友对“问候”的拼写,我将使用拼写错误并押注 Java。想要开始投注池?
  • 我赌的是 C++。我做了一些取证工作(咳咳,他最后的问题是关于 c++ builder 的)。 docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/…

标签: memory memory-leaks


【解决方案1】:

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

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

Private Bytes 和 Virtual Memory Size 的不同是由内存碎片造成的。你唯一能做的就是使用一个试图减少碎片的内存管理器,例如通过使用内存池。

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

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

【讨论】:

    【解决方案2】:

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

    您可能还想检查一下您是否无意中尝试在某一时刻分配一大块内存。

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

    【讨论】:

      猜你喜欢
      • 2011-11-12
      • 1970-01-01
      • 1970-01-01
      • 2016-07-28
      相关资源
      最近更新 更多