【问题标题】:Increase in memory footprint. False alarm or a memory leak?内存占用增加。误报还是内存泄漏?
【发布时间】:2011-05-03 03:51:39
【问题描述】:

我有一个图形程序,我在其中一遍又一遍地创建和销毁相同的对象。总共有 140 个对象。它们被删除和更新,因此数字永远不会增加 140。这是一个要求,因为它是一个压力测试,即我不能有内存池或虚拟对象。现在我相当确定没有任何内存泄漏。我还使用了一个内存泄漏检测器,它没有报告任何泄漏。

问题在于程序的内存占用不断增加(尽管速度很慢,比对象被销毁/创建的速度慢)。所以我的问题是,内存占用量增加是否是内存泄漏的可靠信号,还是有时会具有欺骗性?

编辑:我正在使用 new/delete 创建/销毁对象

【问题讨论】:

  • 什么语言?什么平台?你怎么确定没有内存泄漏?您如何创建对象以及如何销毁它们?
  • 抱歉,我编辑了更多标签。我正在使用 new/delete 创建和销毁,因此在堆上

标签: c++ windows memory-leaks


【解决方案1】:

我强烈建议尝试 Visual Studio 2015(社区版是免费的)。它带有诊断工具,可帮助您分析内存使用情况;它允许您拍摄快照并查看堆

【讨论】:

    【解决方案2】:

    尝试 CRT 中包含的内存分配测试:http://msdn.microsoft.com/en-us/library/e5ewb1h3%28VS.80%29.aspx

    他们帮了很多忙。

    但我注意到,如果您查看某些因素,应用程序的内存消耗确实会略有不同。 Windows 7 还可能在内存分配中创建额外的填充来修复错误:http://msdn.microsoft.com/en-us/library/dd744764%28VS.85%29.aspx

    【讨论】:

    • 我得说,这是一些非常有趣的信息,谢谢。我不知道 windows 有一个容错堆这样的东西。至于内存泄漏检测,我正在处理相当多的库,它们有自己的内存管理器,它们会关闭泄漏检测。它检测到数百甚至数千个我确定不是泄漏的泄漏(例如 Havok SDK)-Visual Leak Detector 在这种情况下同意,但它有自己的无缘无故崩溃问题(我有另一篇关于此的帖子)
    【解决方案3】:

    这种行为似乎确实可能来自没有泄漏的情况。

    您的堆是否有可能获得fragmented

    假设您进行了大量n 大小的分配。您将它们全部释放,这使您的 C 库将这些缓冲区插入到空闲列表中。然后其他一些代码路径使分配小于n,因此空闲列表中的那些块被分块成更小的单元。然后循环的下一次迭代执行另一批大小为n 的分配,空闲列表不再包含该大小的连续内存,malloc 必须向内核请求更多内存。最终,那些“小于n”的分配会像你的“n-sized”一样被释放,但是如果你在存在碎片的地方运行足够多的迭代,我可以看到进程逐渐增加它的内存占用。

    避免这种情况的一种方法是一次性分配所有对象,而不是继续分配/释放它们。由于您使用的是 C++,这可能需要 placement new 或类似的东西。由于您使用的是 Windows,我还可能会提到 Win32 在进程中支持having multiple heaps,因此如果您的对象来自与其他分配不同的堆,您可以避免这种情况。

    【讨论】:

    • 您提出的观点非常好,我的脑海中闪过这个想法。我确信它在一定程度上被支离破碎。内存的涓涓增加会不会仅仅是因为碎片化?
    • 我会选择这个作为正确答案并添加以下链接(其中指出删除并不一定会将内存释放回系统):gnu.org/s/libc/manual/html_node/…
    【解决方案4】:

    如果您的应用程序的进程占用量增加到超出合理限制,这取决于您的应用程序及其功能,并且继续增加直到最终您(将)用完虚拟内存,那么您肯定存在内存泄漏。

    【讨论】:

      【解决方案5】:

      这取决于您是在 CLR(或具有垃圾收集器的虚拟机)下还是仍处于旧模式(如 C++、MFC 等...)

      当你有一个 GC 时 - 你真的无法判断,只有当你测试它足够长的时间。 GC 可以决定暂时不清理你的对象......(有一种方法可以强制它)

      在本机应用程序中,是的,占用空间增加可能意味着泄漏。

      有一些用于 c++ 的工具(非常好的工具)可以找到这些漏洞(google devpartner 或 boundschecker)

      我猜也有一些适用于 c# 和 Java 的工具。

      【讨论】:

      • 我还会将 valgrind 添加到内存检查工具中。
      • 我能找到的唯一一款运行良好的免费检漏仪是 Visual Leak Detector。不幸的是,使用各种 SDK(如 Ogre3d)的某些组合时,它会崩溃而不会通知我任何泄漏(崩溃发生在所有程序中最简单的一个 - 例如初始化 Ogre/Havok 并退出)。还有其他免费的、简单的泄漏检测器,但它们也会崩溃(有时,并非总是),尤其是当 Havok 等库以不同的方式破坏其对象时。他们也错过了第三方库导致的泄漏。我希望我能买得起更好的检漏仪。
      猜你喜欢
      • 2012-07-12
      • 2019-11-11
      • 2011-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-15
      • 2014-06-30
      相关资源
      最近更新 更多