1

我们的 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 个“线程”句柄。“部分”句柄计数比我在开发机器上发现的要高得多。

我查看了“什么会导致部分句柄泄漏? ”的问题,但不幸的是,答案对我没有帮助。我们不使用内存映射文件或 IPC(至少不直接使用),也不使用本文中提到的功能。

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

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

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

4

1 回答 1

1

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

于 2014-09-18T03:36:40.403 回答