发现 .NET 内存泄漏?

Posted

技术标签:

【中文标题】发现 .NET 内存泄漏?【英文标题】:Finding a .NET Memory Leak? 【发布时间】:2011-04-04 18:27:52 【问题描述】:

我创建了一个带有 2 个对话框的示例程序。两个 Dialog 都有一个图片框,一个调用 pictureBox1.Image.Dispose();在受保护的覆盖 void Dispose(bool disposing) 方法中,而另一个没有。

当你运行程序并使用任务管理器查看内存使用情况时,不调用pictureBox1.Image.Dispose();的对话框变得非常明显。内存泄漏非常严重。

有没有人建议一种工具可以以如此清晰的方式显示问题?

有没有办法计算特定 c# 源文件的内存分配/释放?至少这是我能够用非托管 C++ 做的事情。

【问题讨论】:

您可以尝试任何 .net 内存分析器软件,例如 RedGate 或 Jetbrains。 您是否尝试过 Visual Studio 2010 中内置的分析器? 有很多用于分析内存的好工具。这是之前的一篇文章:***.com/questions/399847/net-memory-profiling-tools @PaulKearney-pk 这个帖子已经过时了,工具在过去的 10 年里进化了 【参考方案1】:

在 VS2010 中尝试 Analyze > Launch Performance Wizard 菜单选项并选择内存选项。

在 VS2017 中是 Analyze > Performance Profiler...

【讨论】:

我已经尝试了 Visual Studio 2010 内置的分析器,不幸的是没有发现它特别有用。 您是否打开了“同时收集 .NET 对象生命周期数据”选项?【参考方案2】:

查看 Ants Profiler:http://www.red-gate.com/products/dotnet-development/ants-memory-profiler/

有 14 天的免费试用期和许多有用的教程来帮助您入门。

【讨论】:

【参考方案3】:

作为 VS 的嵌入式性能分析​​器的替代品,我发现 Jetbrains 的 DotMemory 实用且简单。

您可以从正在泄漏的托管代码中快速查看哪些对象类型。 您有一个仪表板,可以查看常见问题(字符串重复等) 您还可以查看非托管内存。界面比较 完整、复杂(你真的可以挖掘和理解很多东西,并快速找到罪魁祸首对象和代码)。 [0]https://www.jetbrains.com/dotmemory/

【讨论】:

以上是关于发现 .NET 内存泄漏?的主要内容,如果未能解决你的问题,请参考以下文章

哪些策略和工具可用于查找 .NET 中的内存泄漏?

。NET中诊断内存泄漏的工具(ASP.NET应用程序)[关闭]

Android ValueAnimator --内存泄漏

java内存泄漏的定位与分析

如何克服 tessnet 内存泄漏?

为啥.NET 没有内存泄漏?