【问题标题】:How to solve Private bytes (Native memory) leak?如何解决私有字节(本机内存)泄漏?
【发布时间】:2011-10-26 08:40:15
【问题描述】:

我正在开发一个似乎有泄漏的 C# 应用程序。 我使用了内存分析器,发现我的

私有字节不断增加,但所有堆中的字节没有,这意味着它可能是本机内存泄漏

现在我卡住了,如何在本机代码中查找内存泄漏?

【问题讨论】:

  • 你知道哪里漏了吗?没有代码,我们无法为您提供帮助...
  • 您不用 C# 编写本机代码。当然,您唯一能做的就是确保正确处理 InterOp?
  • 这是分析器的一个常见问题,它们告诉你的比你想知道的要多。增长的私有字节并不罕见,它可能需要一段时间才能稳定下来。你真的得到 OutOfMemory 异常吗?如果没有,请为此翻转忽略位。
  • @Karel Frajtak - 如果我告诉你代码是 GOOGLE 的下一个引擎,你会让我保密吗?
  • 从 GOOGLE 偶然发现了这个问题,想知道我是否正在使用 GOOGLE 的下一个引擎来解决 Erez 正在处理的内存泄漏问题。

标签: c# debugging memory-leaks pinvoke


【解决方案1】:

首先,如果你有泄漏进程的转储,你可以在 WinDbg 中打开它并发出命令: !address -summary

  • 如果 RegionUsageHeap 很大,那么应该是原生内存泄漏
  • 如果 RegionUsageIsVAD,则应该是 .NET 内存泄漏。

如果这是本机泄漏,那么您有 2 个选项:

  • 使用 DebugDiag :出现提示时,选择“本机内存泄漏和处理泄漏”,选择您要诊断的进程,然后开始使用应用程序,直到您试验内存泄漏。完成后,生成应用程序的完整转储(右键单击泄漏规则并选择完整用户转储)。然后您可以分析生成的转储(您需要正确配置符号才能有效地工作):在“高级分析”选项卡上,选择“内存压力分析器”,打开转储文件并按“开始分析”。这将生成您可以分析的 html 报告。您可以参考此page 了解详细演练。

  • 使用应用程序验证程序/WinDbg。在应用程序验证器中,选择您的应用程序 (.exe)。在测试页面中,确保选择了 Basics/Heaps。在下部窗格中,确保“跟踪”设置为 true。保存配置后,重新运行应用程序并在发生泄漏时生成完整转储。不要忘记在生成转储后清理应用程序标志。然后,您可以从 WinDbg 中打开转储,并在“!heap”命令的帮助下调查泄漏。特别是,'!heap -l' 会给你一个泄漏块的列表,'!heap -p -a' 会显示一个块的细节,包括分配的调用堆栈。

如果这是 .NET 泄漏,可以使用第三方工具对其进行故障排除。从 1.2 版开始,DebugDiag 还可以执行 .NET 内存泄漏分析(但从未尝试过)。

【讨论】:

    【解决方案2】:

    诊断托管应用程序中的本机内存泄漏(至少在最初)与诊断任何其他本机应用程序中的内存泄漏非常相似。

    我通常处理这些问题的方法是让进程泄漏大量内存,进行完整的进程转储,然后检查转储以查看使用最多内存的内容。例如,如果您的进程具有~20MB 的正常/初始私有字节,但您可以让您的进程泄漏内存,直到它有~200MB 的私有字节,那么很有可能泄漏~180MB 的内存 - 一般来说分配的内存最多的地方就是你应该开始寻找的地方。

    Microsoft 有一个非常有用的工具,称为DebugDiag - 最初开发用于诊断 IIS 中的内存泄漏,它是一个非常实用的工具,在处理内存问题时非常方便。如果你给它一个故障转储,它会执行一些分析,并且应该(至少)告诉你哪个模块分配了所有内存,然后你可以开始更具体地查看该模块是如何使用的。

    【讨论】:

      【解决方案3】:

      如果没有更多信息,很难给您一个可靠的答复,但听起来您尝试使用的 lib 存在内存泄漏。您需要使用适当的工具来获取该库,具体取决于它所使用的语言。如果您没有该库的源代码,请联系开发人员并让他们修复泄漏。

      如果您可以发布库的名称和您的一些源代码(以及本机方法签名),我们或许可以给您一些更具体的建议。

      【讨论】:

        【解决方案4】:

        .net 框架管理的堆中的私有字节,您需要使用专业工具来分析您的源。比如使用红门内存分析器,查找已创建但未处理的对象。

        【讨论】:

          【解决方案5】:

          通常在使用ANTS Memory Profiler 查找内存泄漏时,我会得到最好的结果。

          Or other tools,我个人对 ANTS 的体验最好)

          【讨论】:

            猜你喜欢
            • 2015-06-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-11-18
            • 2018-04-11
            • 2020-04-07
            • 1970-01-01
            相关资源
            最近更新 更多