【问题标题】:Mysterious "Section Handle" memory leak (C# .NET / WinForms)神秘的“Section Handle”内存泄漏(C# .NET / WinForms)
【发布时间】:2013-06-26 11:43:47
【问题描述】:

我们的 C# .NET 应用程序遇到“OutOfMemoryException”。它们发生在随机函数调用中,通常在需要绘制图像 (System.Drawing.Image.get_RawFormat) 或需要创建线程 (System.Threading.Thread.StartInternal) 时。

不用说,我无法在我的开发机器上重现崩溃。我获取了崩溃应用程序的堆快照,并使用 Process Explorer 查看了另一个崩溃实例。

例如,在一个实例中,有 380M 堆 RAM(看起来还可以)、7758 个句柄(看起来相当高)、2245 个 USER- 和 1798 个 GDI 对象)。

使用不错的软件“Process Hacker”,我能够获得“句柄类型直方图”。这显示了 4181 个“节”句柄、2834 个“事件”句柄和 420 个“线程”句柄。 “Section”句柄数比我在开发机器上发现的要高得多。

我查看了问题“What can cause section handle leaks?”,但不幸的是,答案对我没有帮助。我们不使用内存映射文件或 IPC(至少不直接使用),也不使用本文中提到的功能。

我尝试对应用程序进行内存分析,但没有发现任何明显或严重的内存泄漏。我在运行 GC 并打印内存信息/句柄计数的应用程序中添加了一个挂钩,但使用此热键我无法重现泄漏,即使在生产环境中也是如此。

我们使用的第三方软件也可能导致某些问题(DevExpress 控件和其他组件)。

目前,我很无知,想请教您的建议。我可以查看或检查什么?我怎样才能继续追查问题?感谢您的帮助!

【问题讨论】:

  • 我知道在这里提问可能为时已晚,但是这方面有什么进展吗?我遇到了和你类似的问题。

标签: .net memory-leaks out-of-memory


【解决方案1】:

对于这种情况,一种可行的方法是开始注释掉重复逻辑的部分。首先移除大部分,然后检查是否有泄漏。如果泄漏消失了,再次开始逐段取消注释代码,直到泄漏重新开始。这很烦人,但是当其他选项不存在时,它确实可以帮助您确定罪魁祸首。

【讨论】:

    猜你喜欢
    • 2011-02-24
    • 2013-07-25
    • 1970-01-01
    • 1970-01-01
    • 2022-12-06
    • 1970-01-01
    • 2014-05-01
    • 2016-07-30
    • 2018-12-10
    相关资源
    最近更新 更多