1

我正在开发一个基于 .NET 的应用程序 (.NET 4),它在System.OutOfMemoryException上运行一段时间后崩溃

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

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

未管理的内存总量(如果在图像中看不清楚,则约为 285 MB,所有堆中对象的总大小约为 76MB)

我还检查了 taskmgr 中的“句柄”计数,崩溃时应用程序进程的句柄似乎约为 8120 个。

探查器统计图像 我怎样才能进一步检查发生了什么?什么可能的原因会导致这样的异常?

4

1 回答 1

2

这是一个图像(位图)。它的大小不是“非常大”(大约 50kb)。这可能是伪装的一些潜在的本机异常吗?(就像来自 GDI 的东西)

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

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

这是Connect 上的一个长期错误,官方回应如下:

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

...

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

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

于 2013-08-07T16:13:33.313 回答