我正在开发一个基于.NET的应用程序(.NET 4),在 System.OutOfMemoryException
上运行一段时间后崩溃在任务管理器中检查应用程序的过程或尝试使用其他工具(如CLR Profiler和ANTS Memory Profiler)时,似乎应用程序最大限度地没有可用内存或任何其他限制(我相信) Windows对每个进程都有限制,而.NET本身可能在某种程度上受到限制。)
这是从崩溃前不久的ANTS Profiler截图。
未管理内存的总量(如果在图像中没有清楚地看到它是~285 MB,并且所有堆中的对象的总大小是~76MB)
我还检查了taskmgr中的“Handles”计数,看起来在应用程序崩溃时的过程约为8120个句柄。
我怎样才能进一步检查发生了什么?可能的原因可能导致这样的例外吗?
答案 0 :(得分:2)
这是一张图片(位图)。它的尺寸不是“非常大”(大约50kb)。这可能是伪装的一些潜在的本机异常吗? (比如来自GDI的东西)
是的,这可能是原因。当存在与内存消耗无关的错误时,GDI经常会抛出OutOfMemoryException
。
我建议您检查您要加载的Bitmap
,并验证它是否以GDI支持的格式正确格式化。
这是一个long term bug on Connect,其官方响应为:
你在这里看到了绘图引擎(GDI +)的一个特性。 GDI +喜欢在与内存无关的情况下返回OutOfMemoryExceptions。不幸的是,GDI +是我们从Windows获得的组件,因此我们无法解决这些问题
...
当您将无效参数传递给函数时,我们经常会看到这些......
检查加载Bitmap
的调用以及图像文件的格式细节可能会导致“真正的”根本原因。