我正在使用Visual C# Express 2008,并且我有一个应用程序在表单上启动,但使用一个带有委托显示函数的线程来处理基本上所有的处理。这样我的表单在任务被处理时不会锁定。
最近,在重复执行一些过程后(程序处理传入数据,因此当数据进入时,过程会重复),我的应用程序将崩溃并显示System.OutOfMemory错误。
错误消息中的堆栈跟踪是无用的,因为它只指导我到调用委托表单控件函数的行。
我听说人们使用SysInternals的ProcMon来查看为什么会出现这样的错误。但是,我却无法理解它。我使用的内存量在程序运行时不会改变,如果它增加了,它就会回来。而且,即使它在增加,我如何找出哪个部分是问题?
我该如何调查这个问题?
编辑:
所以,更深入地研究了这个问题后,我查看了任何我曾经重新声明过的东西。有几个实例,我有hugematrix = new uint [gigantic],所以我去掉了其中的大约3个。
但是,与其摆脱错误不同,现在它变得更加模糊和混乱。
我的应用程序使用OpenGL渲染传入的数据。现在,它不再抛出“System.OutOfMemory”,而是简单地不使用OpenGL渲染任何东西。
我的代码唯一的区别是我不为绘制数据创建新矩阵。这样,我希望,我的数组保持在内存中的同一位置,并且不对我的LOH做任何自杀行为。
不幸的是,这使得问题超出了我的能力范围。没有任何错误弹出,并且所有的数据结构似乎仍然正确填充,我该如何找到问题?OpenGL是否以隐蔽的方式使用内存,以便在失败时不抛出异常?内存是否仍然是一个问题?我该如何找出?所有的内存分析器似乎都告诉我很少。
编辑:
在这个社区的大力支持下(特别感谢Amissico),错误最终被发现了。显然,我正在向OpenGL列表添加项目,并且从未将它们从列表中删除。
最后让我知道问题的应用程序是.Net Memory Profiler。在崩溃时,它显示类别中有1.5GB的数据。通过逐个排除(命名的其他列表中的所有内容),最后要从列表中检查的是OpenGL渲染管道。剩下的就是历史。
最近,在重复执行一些过程后(程序处理传入数据,因此当数据进入时,过程会重复),我的应用程序将崩溃并显示System.OutOfMemory错误。
错误消息中的堆栈跟踪是无用的,因为它只指导我到调用委托表单控件函数的行。
我听说人们使用SysInternals的ProcMon来查看为什么会出现这样的错误。但是,我却无法理解它。我使用的内存量在程序运行时不会改变,如果它增加了,它就会回来。而且,即使它在增加,我如何找出哪个部分是问题?
我该如何调查这个问题?
编辑:
所以,更深入地研究了这个问题后,我查看了任何我曾经重新声明过的东西。有几个实例,我有hugematrix = new uint [gigantic],所以我去掉了其中的大约3个。
但是,与其摆脱错误不同,现在它变得更加模糊和混乱。
我的应用程序使用OpenGL渲染传入的数据。现在,它不再抛出“System.OutOfMemory”,而是简单地不使用OpenGL渲染任何东西。
我的代码唯一的区别是我不为绘制数据创建新矩阵。这样,我希望,我的数组保持在内存中的同一位置,并且不对我的LOH做任何自杀行为。
不幸的是,这使得问题超出了我的能力范围。没有任何错误弹出,并且所有的数据结构似乎仍然正确填充,我该如何找到问题?OpenGL是否以隐蔽的方式使用内存,以便在失败时不抛出异常?内存是否仍然是一个问题?我该如何找出?所有的内存分析器似乎都告诉我很少。
编辑:
在这个社区的大力支持下(特别感谢Amissico),错误最终被发现了。显然,我正在向OpenGL列表添加项目,并且从未将它们从列表中删除。
最后让我知道问题的应用程序是.Net Memory Profiler。在崩溃时,它显示类别中有1.5GB的数据。通过逐个排除(命名的其他列表中的所有内容),最后要从列表中检查的是OpenGL渲染管道。剩下的就是历史。