C# 正在抛出System.OutOfMemory。如何找到罪犯?

C# 正在抛出System.OutOfMemory。如何找到罪犯?,c#,memory,C#,Memory,我使用的是Visual C#Express 2008,我有一个在表单上启动的应用程序,但使用一个具有委托显示功能的线程来处理基本上所有的处理。这样,在处理任务时,我的表单不会被锁定 最近,我的应用程序经过多次重复处理(程序处理传入数据,因此当数据传入时,该过程会重复)后,会因System.OutOfMemory错误而崩溃 错误消息中的堆栈跟踪是无用的,因为它只将我指向调用委托表单控制函数的行 我听说有人说他们使用SysInternals中的ProcMon来了解为什么会发生这样的错误。但我,就我的

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

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

错误消息中的堆栈跟踪是无用的,因为它只将我指向调用委托表单控制函数的行

我听说有人说他们使用SysInternals中的ProcMon来了解为什么会发生这样的错误。但我,就我的一生而言,无法理解它。我使用的内存量不会随着程序的运行而改变,如果它上升,它就会下降。另外,即使它在上升,我如何找出我的程序的哪一部分是问题

我如何着手调查这个问题

编辑:

所以,在深入研究这个问题之后,我仔细检查了我曾经重新声明过的任何东西。有几个例子,我有hugematrix=new uint[Gignant],所以我去掉了其中的3个

它不但没有消除错误,反而变得更加模糊和混乱

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

我的代码中唯一的区别是,我没有创建新的矩阵来保存我绘制的数据。这样,我希望,我的阵列在记忆中保持不变,不会对我的LOH造成任何自杀性的影响

不幸的是,这使这头野兽远远超出了我微薄的能力范围。在零错误出现的情况下,我所有的数据结构显然仍然正确填充,我如何才能发现我的问题?OpenGL是否以一种模糊的方式使用内存,以便在失败时不会抛出异常?记忆还是个问题吗?我怎么知道?世界上所有的记忆分析器似乎都告诉我很少

编辑:

在这个社区的大力支持下(对Amissico来说是额外的荣誉),这个错误终于被根除了。很明显,我是在向OpenGL列表中添加项目,并且从未将它们从列表中删除


最终让我加入的应用程序是.Net内存分析器。崩溃时,它显示了
类别中的1.5GB数据。通过消除过程(列表中的所有其他名称),最后要从列表中勾选的是OpenGL渲染pipleline。剩下的就是历史。

您需要使用内存探查器,例如ants内存探查器来找出导致此错误的原因


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

以下注意事项:

  • 确保生成的线程已销毁(中止或函数返回)。太多的线程可能导致应用程序失败,尽管在任务管理器中使用的内存不是太高
  • 内存泄漏。是的,是的,您可以在.net中很好地使用它们,而无需将引用设置为null。这可以通过使用内存分析器(如dotTrace或ANTS内存分析器)来解决

  • 位于的.NET Framework 2.0的CLR探查器


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

    根据您评论中的描述,我怀疑您没有正确处理映像,或者您有严重的大对象堆碎片,并且在尝试分配新映像时,没有足够的连续可用空间。查看此问题了解更多信息-

    我也遇到了OutOfMemoryException问题:

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


    它总是在同一行上崩溃吗?如果能看到一些代码就好了。显示委托实际执行的操作的代码在哪里?能否提供有关如何检索传入数据的更多信息?同步/异步?事件投票?你能告诉我你的graphic和worker线程是如何进行通信的吗?一些示例代码会很有帮助,也许可以创建一个与你期望的最大值一样大的数组。然后维护保持当前有效数组边界的变量。我并不是在循环上运行。我想我需要弄清楚我的术语。基本上,它只是一个事件处理程序,只有一个。所以,当我说在那里循环时,我的意思是事件被触发多次。我刚刚开始使用Redant,我看不到任何死亡赠品。我感觉你完全正确。。。我没有太多的线程在那里,我会处理我的图像,只要我不需要他们。这基本上是一堆东西。。。那个链接有很多我根本不懂的东西。。。但我想是时候开始学习了。我想我可以。。。不要释放我使用的内存,并一直将其放在同一个位置,这样我就不会出现碎片问题。您可以在这里阅读更多信息-。。。一种策略是序列化和反序列化LOH上的对象。这将压缩堆,但可能会对性能造成相当大的影响。您不能只使用一个映像,然后清除它,然后在下一个映像中再次使用它吗?为什么要创建和处置?我假设每个图像的大小都相同。我注意到您对将位图加载到图片框中有疑问。问题是否与此应用程序有关?是的,您必须保留图片框图像。这是正常的行为。需要查看位图创建。你能发个帖子给别人看吗?如果不发布您的代码作为.dotTrace的答案,则可能会关闭