我们的C#.NET应用程序遇到“OutOfMemoryException”。它们发生在随机函数调用中,通常需要绘制图像(System.Drawing.Image.get_RawFormat)或需要创建线程(System.Threading.Thread.StartInternal)。
毋庸置疑,我无法在我的开发机器上重现崩溃。我获得了一个崩溃的应用程序的堆快照,我使用Process Explorer查看了另一个崩溃的实例。
例如,在一个实例中,有380M堆RAM(看起来没问题),7758个句柄(看起来相当高),2245个USER和1798个GDI对象)。
使用漂亮的软件“Process Hacker”我能够获得“句柄类型直方图”。这显示了4181个“Section”手柄,2834个“Event”手柄和420个“Thread”手柄。 “Section”句柄数远远高于我在开发机器上找到的数量。
我回顾了问题“What can cause section handle leaks?”,但不幸的是答案对我没有帮助。我们不使用内存映射文件或IPC(至少不是直接),我们不使用本文中提到的功能。
我尝试将内存配置文件应用程序,但没有发现任何明显或重大的内存泄漏。我在运行GC并打印内存信息/句柄计数的应用程序中添加了一个钩子,但是使用这个热键我无法重现泄漏,即使在生产环境中也是如此。
我们正在使用可能也会导致某些问题的第三方软件(DevExpress控件和其他组件)。
目前,我很无能为力,想请教你。我可以查看或检查什么?我该如何着手追查问题?谢谢你的帮助!
答案 0 :(得分:1)
对于这种情况,一种有效的方法是开始注释掉重复逻辑的各个部分。首先删除大部分内容,并检查是否有泄漏。如果泄漏消失,请开始逐个取消注释代码,直到泄漏开始恢复。这很烦人,但是当其他选项不存在时,它可以真正帮助你找到罪魁祸首。