我正在进行图像处理项目,在我的应用程序中,我正在处理文件夹中的一个接一个的图像(我在while循环中处理图像),文件夹中包含1000多个图像。我对每4个图像计数使用垃圾收集(GC.Collect())。在处理了1000张图像后,我得到了OutOfMemoryException
(位图图像分配给图片框时会出现例外),如何解决这个问题?
两者都没有。在不做坏事的情况下获得这些例外是可以的。大型堆香术仍是一个尚未解决的问题。
您最好的机会是打开一个单独的进程来处理图像,直到它在主应用程序的控制下用完(然后重新启动),和/或移动到64位(更大的空间会降低碎片问题的可能性)。
当位图图像被分配给图片框时,例外情况就会发生
这需要在一个块中有大量内存。告诉我们这些图片吗?它们有多大?为什么picturebox(批量处理通常不需要看到图像)。无论如何,这是一个很好的问题,如果图像很大,这是意料之中的事。
这取决于您如何使用图像。很可能您没有处理相关的实例。尝试用using语句包装实例:
using (var image = ...new instance created...)
{
// ...do stuff...
}
查找内存泄漏。您可以将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命令的结果中复制粘贴地址。