【问题标题】:how to solve OutOfMemoryException in c#如何在 C# 中解决 OutOfMemoryException
【发布时间】:2012-02-09 06:35:41
【问题描述】:

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

【问题讨论】:

  • 什么函数产生错误?
  • 位图图像分配给图片框时会出现异常
  • 你永远不应该使用 GC.Collect().. ,尤其是在循环中。这真的很麻烦,升级你所有的对象生成,并且简单地让 GC 完全没用.. 它甚至可能导致问题本身......请参阅下面提到的其他解决方案并删除 collect 方法
  • +1。这是一个有效的问题 - 没有多少开发人员了解 .NET 内存管理的内部工作原理,并且这里存在与 alrge 位图有关的问题。这不一定是一个愚蠢的问题——一个显示出一些无知的问题,但是当 95% 的人不知道答案时,这不是无知,而是一个有效的观点。
  • 那么我们什么时候可以使用 GC.Collect()

标签: c# c#-3.0 csharpcodeprovider


【解决方案1】:

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

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

位图图像分配给图片框时会出现异常

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

【讨论】:

  • 一张图片大小为1MB(位图图片)
  • 你的意思是 1mb 在内存中,还是在磁盘上?内存大小是多少?内存中的 1mb 不是问题,磁盘上的 1mb 图像可能是数百 mb 的内存,然后您就会遇到碎片问题。查看connect.microsoft.com/VisualStudio/feedback/details/521147/… 获取问题示例。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    查找内存泄漏。您可以将 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 命令的结果中复制粘贴地址。

    【讨论】:

      猜你喜欢
      • 2018-01-04
      • 2011-06-17
      • 2021-05-19
      • 1970-01-01
      • 2023-03-19
      • 2015-07-19
      • 2012-02-25
      • 2013-11-16
      • 2016-03-21
      相关资源
      最近更新 更多