我们的 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 控件和其他组件)。
目前,我很无知,想请教您的意见。我可以查看或检查什么?我怎样才能继续追查问题?谢谢你的帮助!