如何解决私有字节(本机内存)泄漏

本文关键字:字节 本机 内存 泄漏 解决 何解决 | 更新日期: 2023-09-27 18:12:30

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

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

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

如何解决私有字节(本机内存)泄漏

首先,如果您有泄漏进程的转储,您可以在WinDbg中打开它并发出命令:!地址汇总

  • 如果RegionUsageHeap很大,那么它应该是本机内存泄漏
  • 如果RegionUsageIsVAD,那么它应该是一个。net内存泄漏。

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

  • 使用DebugDiag:当提示时,选择"本机内存泄漏和处理泄漏",选择您要诊断的进程,并开始与应用程序一起工作,直到您尝试内存泄漏。完成后,生成应用程序的完整转储(右键单击泄漏规则并选择完整用户转储)。然后,您可以分析生成的转储(您需要正确配置符号才能有效地工作):在"高级分析"选项卡上,选择"内存压力分析仪",打开转储文件并按"开始分析"。这会生成一个html报告供您分析。

  • 使用Application Verifier/WinDbg。在应用程序验证程序中,选择您的应用程序(.exe)。在测试页面中,确保选择Basics/Heaps。在下面的窗格中,确保"Traces"设置为true。保存配置后,重新运行应用程序,并在发生泄漏时生成完整转储。不要忘记在生成转储之后清除应用程序标志。然后,您可以在WinDbg中打开转储文件,并在'!堆的命令。特别是"!"Heap -l'会给你一个泄露块的列表,'!heap -p -a '将显示块的详细信息,包括分配的调用堆栈。

如果这是一个。net泄漏,有第三方工具来解决它。从1.2版本开始,DebugDiag也可以执行。net内存泄漏分析(但从未尝试过)。

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

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

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

如果没有更多的信息,很难给您一个可靠的响应,但是听起来您试图使用的lib有内存泄漏。根据编写库的语言,您需要使用适当的工具。如果你没有库的源代码,请联系开发人员并让他们修复泄漏。

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

私有字节在堆由。net框架管理,你需要使用专业的工具来分析你的源代码。例如使用红门内存分析器,查找已创建但未被处置的对象。

通常在使用ANTS内存分析器查找内存泄漏时,我有最好的结果。

(或其他工具,我个人对ANTS有最好的体验)