C# 如何解决c语言中的OutOfMemoryException#

C# 如何解决c语言中的OutOfMemoryException#,c#,c#-3.0,csharpcodeprovider,C#,C# 3.0,Csharpcodeprovider,我正在从事图像处理项目,在我的应用程序中,我正在逐个处理文件夹中的图像(我在while循环中处理图像),文件夹包含1000多个图像。我每4个图像计数使用一次垃圾收集(GC.Collect())。在处理了1000幅图像后,我得到了一个“OutOfMemoryException”(当位图图像分配给picturebox时,该异常将通过),如何解决这个问题?这取决于您如何使用图像。很可能您没有处理相关实例。尝试将实例包装到using语句中: using (var image = ...new insta

我正在从事图像处理项目,在我的应用程序中,我正在逐个处理文件夹中的图像(我在while循环中处理图像),文件夹包含1000多个图像。我每4个图像计数使用一次垃圾收集(GC.Collect())。在处理了1000幅图像后,我得到了一个“OutOfMemoryException”(当位图图像分配给picturebox时,该异常将通过),如何解决这个问题?

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

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

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

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

!DumpHeap -type LeakingClass
然后使用地址调用GCRoot,查看是什么将对象固定在内存中:

!GCRoot <your address here>
!根

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

noew。在不做坏事的情况下获得这些异常通常是可以的。大堆碎片仍然是一个未解决的问题

您最好打开一个单独的进程,该进程在主应用程序的控制下运行(然后重新启动),并/或移动到64位(空间越大,碎片问题的可能性越小)


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


这在一个块中需要大量内存。告诉我们这些图像?它们有多大?为什么picturebox(批处理通常不需要查看图像)。无论如何,这是一个明确的问题,如果图像很大,这是意料之中的。

什么函数会产生错误?当位图图像分配给PictureBoxy时,异常将通过。您永远不应该使用GC.Collect(),尤其不是在循环中。这可能会带来麻烦,升级所有对象生成,并使GC毫无用处。。它甚至可能导致问题本身。。。请参阅下面列出的其他解决方案,并删除collect方法+1。这是一个有效的问题-没有多少开发人员知道.NET内存管理的内部工作原理,这里有一个关于大型位图的问题。这不一定是一个愚蠢的问题——一个显示出一些无知的问题,但是当95%的人不知道asnwer时,这不是无知,而是一个有效的问题。那么我们什么时候可以使用GC.Collect()一个图像大小是1MB(位图图像),你的意思是1MB内存还是磁盘?内存大小是多少?1mb内存不是问题,光盘上的1mb映像可能会有数百mb的内存,然后会遇到碎片问题。检查问题的示例。