OutOfMemoryException即使应用程序似乎没有消耗最大内存量

时间:2013-08-07 15:56:13

标签: .net memory crash clr out-of-memory

我正在开发一个基于.NET的应用程序(.NET 4),在 System.OutOfMemoryException

上运行一段时间后崩溃

在任务管理器中检查应用程序的过程或尝试使用其他工具(如CLR Profiler和ANTS Memory Profiler)时,似乎应用程序最大限度地没有可用内存或任何其他限制(我相信) Windows对每个进程都有限制,而.NET本身可能在某种程度上受到限制。)

这是从崩溃前不久的ANTS Profiler截图。

未管理内存的总量(如果在图像中没有清楚地看到它是~285 MB,并且所有堆中的对象的总大小是~76MB)

我还检查了taskmgr中的“Handles”计数,看起来在应用程序崩溃时的过程约为8120个句柄。

Profiler stats image 我怎样才能进一步检查发生了什么?可能的原因可能导致这样的例外吗?

1 个答案:

答案 0 :(得分:2)

  

这是一张图片(位图)。它的尺寸不是“非常大”(大约50kb)。这可能是伪装的一些潜在的本机异常吗? (比如来自GDI的东西)

是的,这可能是原因。当存在与内存消耗无关的错误时,GDI经常会抛出OutOfMemoryException

我建议您检查您要加载的Bitmap,并验证它是否以GDI支持的格式正确格式化。

这是一个long term bug on Connect,其官方响应为:

  

你在这里看到了绘图引擎(GDI +)的一个特性。 GDI +喜欢在与内存无关的情况下返回OutOfMemoryExceptions。不幸的是,GDI +是我们从Windows获得的组件,因此我们无法解决这些问题

...

  

当您将无效参数传递给函数时,我们经常会看到这些......

检查加载Bitmap的调用以及图像文件的格式细节可能会导致“真正的”根本原因。