0

我正在处理图像处理项目,在我的应用程序中,我正在处理来自文件夹的图像(我在 while 循环中处理图像),文件夹包含 1000 多个图像。我正在使用垃圾收集(GC.Collect() ) 每 4 个图像计数。在处理了1000张图像后OutOfMemoryException(当位图图像分配给图片框时会出现异常),如何解决这个问题?

4

3 回答 3

1

都没有。在不做坏事的情况下获得这些例外是完全可以的。大堆碎片化仍然是一个未解决的问题。

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

当位图图像分配给图片框时,异常将通过

这需要一大块内存。告诉我们这些图像?它们有多大?为什么是picturebox(批处理通常不需要看图像)。无论如何,这是一个已定义的问题,如果图像很大,这是可以预料的。

于 2012-02-09T06:56:32.177 回答
0

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

using (var image = ...new instance created...)
{
    // ...do stuff...
}
于 2012-02-09T06:40:55.490 回答
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-内存泄漏.aspx

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

!DumpHeap -type LeakingClass

然后使用地址调用 GCRoot 并查看将对象固定在内存中的内容:

!GCRoot <your address here>

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

于 2012-02-09T06:41:56.020 回答