如何在c#中解决OutOfMemoryException

时间:2012-02-09 06:35:42

标签: c# c#-3.0 csharpcodeprovider

我正在处理图像处理项目,在我的应用程序中我从文件夹中逐个处理图像(我在while循环中处理图像),文件夹包含1000多个images.i我正在使用垃圾收集(GC。收集())每4个图像计数。处理完1000张图像后我得到OutOfMemoryException(当位图图像分配到图片框时会有例外),如何解决这个问题?

3 个答案:

答案 0 :(得分:1)

不是。如果不做坏事就可以获得这些例外。大堆Fragemntation仍然是一个未解决的问题。

您最好的机会是在主应用程序的控制下打开一个对图像起作用的单独进程,直到它耗尽(然后重新启动),和/或移动到64位(更大的空间使碎片问题不太可能发生)。

  

将位图图像分配给图片框时会发生异常

这需要大量内存。告诉我们这些图片?它们有多大?为什么图片框(批处理通常不需要看图像)。无论如何,这是一个严格的问题,如果图像很大,那就是预期的。

答案 1 :(得分:0)

这取决于您使用图像的方式。您可能没有处置相关实例。尝试将实例包装在using语句中:

using (var image = ...new instance created...)
{
    // ...do stuff...
}

答案 2 :(得分:0)

查找内存泄漏。您可以将WinDbg与gcroot命令一起使用。请参阅以下链接。

http://blogs.msdn.com/b/delay/archive/2009/03/11/where-s-your-leak-at-using-windbg-sos-and-gcroot-to-diagnose-a-net-memory-leak.aspx

您需要调查嫌犯。您可以使用SOS调试扩展。 以下命令将为您提供内存中类的实例列表及其地址:

!DumpHeap -type LeakingClass

然后用一个地址调用GCRoot,看看内存中的对象是什么引脚:

!GCRoot <your address here>

您可以从DumpHeap命令的结果中复制粘贴地址。