半最近,经过多次重复过程(程序处理传入的数据,所以当数据进入时,过程重复)我的应用程序将崩溃,出现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