System.OutOfMemory被抛出。如何找到罪魁祸首?

时间:2010-03-05 14:20:41

标签: c# memory

我正在使用Visual C#Express 2008,我有一个在表单上启动的应用程序,但是使用具有委派显示功能的线程来处理基本上所有的处理。这样,我的表单在处理任务时不会锁定。

半最近,经过多次重复过程后(程序处理传入的数据,所以当数据进入时,重复该过程)我的应用程序将因System.OutOfMemory错误而崩溃。

错误消息中的堆栈跟踪是无用的,因为它只会将我引导到我调用委托表单控件函数的行。

我听说有人说他们使用SysInternals的ProcMon来查看为什么会出现这样的错误。但是,对于我的生活,我无法弄明白。我正在使用的内存量不会随着程序的运行而改变,如果程序运行起来,它会恢复原状。另外,即使它上升了,我怎么知道我的程序的哪个部分是问题?

我该如何调查此问题?

编辑:

因此,在深入研究这个问题之后,我浏览了一些我曾经重新宣布过的事情。有几个例子我有hugematrix = new uint [gigantic],所以我摆脱了其中的大约3个。

而不是摆脱错误,它现在更加模糊和混乱。

我的应用程序获取传入的数据,并使用OpenGL呈现它。现在,它不是抛出“System.OutOfMemory”,而是使用OpenGL渲染任何内容。

我的代码中唯一的区别是我没有制作新的矩阵来保存我绘制的数据。这样,我希望,我的阵列在记忆中保持相同的位置,对我的LOH没有任何自杀行为。

不幸的是,这使得野兽远远超出了我的微薄手段。弹出零错误,我的所有数据结构显然仍然正常填充,我怎么能找到我的问题? OpenGL是否以晦涩的方式使用内存,以便在失败时不抛出异常?记忆还有问题吗?我怎么知道的?世界上所有的内存分析器似乎都很少告诉我。

编辑:

随着来自这个社区的大量支持(对Amissico的额外赞誉),错误终于被根除了。显然我正在将项目添加到OpenGL列表中,并且从不将它们从列表中删除。

最终让我知道的应用程序是.Net Memory Profiler。在崩溃时,它显示了<unknown>类别中的1.5GB数据。通过消除过程(列表中所有其他名称),从列表中检查的最后一件事是OpenGL渲染pipleline。其余的都是历史。

5 个答案:

答案 0 :(得分:5)

根据您评论中的描述,我怀疑您要么没有正确处理图像,要么您有严重的大对象堆碎片,并且在尝试分配新图像时,没有足够的连续图像可用空间。有关详细信息,请参阅此问题 - Large Object Heap Fragmentation

答案 1 :(得分:1)

您需要使用内存分析器,例如蚂蚁内存分析器,以找出导致此错误的原因。

您是否在每个循环上重新注册事件处理程序而不是取消注册它?

答案 2 :(得分:1)

适用于http://www.microsoft.com/downloads/details.aspx?familyid=A362781C-3870-43BE-8926-862B40AA0CD0&displaylang=en

的.NET Framework 2.0的CLR Profiler

内存碎片最常见的原因是字符串创建过多。

答案 3 :(得分:0)

以下注意事项:

  1. 确保您生成的线程被销毁(中止或函数返回)。太多线程可能会使应用程序失败,尽管在任务管理器中使用的内存不是太高
  2. 内存泄漏。是的,是的,你可以在.net中很好地引用它们而不设置对null的引用。这可以通过使用像dotTrace或ANTS Memory Profiler
  3. 这样的内存分析器来解决

答案 4 :(得分:0)

我也有一个OutOfMemoryException问题: Microsoft Visual C# 2008 Reducing number of loaded dlls

原因是2GB GB虚拟地址空间碎片化,而海报nobugz建议Sysinternal's Vmmap utility这对诊断非常有帮助。您可以使用它来检查您的可用内存区域是否随着时间的推移变得更加分散。 (首先按大小排序然后按类型排序 - >刷新重复排序,你可以看到连续的空闲内存块是否变小了)