当前位置 : 主页 > 编程语言 > c语言 >

c# – System.OutOfMemory被抛出.如何找到罪魁祸首?

来源:互联网 收集:自由互联 发布时间:2021-06-25
我正在使用Visual C#Express 2008,我有一个在表单上启动的应用程序,但使用具有委托显示功能的线程来处理基本上所有的处理.这样,我的表单在处理任务时不会锁定. 半最近,经过多次重复过程
我正在使用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.其余的都是历史.

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