如何解决c#中的OutOfMemoryException
我正在研究图像处理项目,在我的应用程序中,我正在处理文件夹中的一张一张图像(我正在 while 循环中处理图像),文件夹包含超过 1000 个图像。我正在使用垃圾收集(GC.Collect() ) 每 4 个图像计数。处理 1000 个图像后,出现 OutOfMemoryException
(当位图图像分配给图片框时会出现该异常),如何解决这个问题?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
也不新。在不做坏事的情况下获得这些例外是完全可以的。大堆碎片仍然是一个未解决的问题。
最好的机会是在主应用程序的控制下打开一个单独的进程来处理图像,直到它耗尽(然后重新启动),和/或移动到 64 位(更大的空间使碎片问题不太可能发生)。
这需要在一个块中使用大量内存。告诉我们那些图像?它们有多大?为什么是图片框(批处理通常不需要看到图像)。无论如何,这是一个明确的问题,如果图像很大,这是可以预料的。
Neither noew. It is toally ok to get those exceptions without doing soething bad. Large Heap Fragemntation is still an unsolved problem.
Your best chance is to open a separate process that works on images until it runs out (then restart it) under the control of your main application, and / or move to 64 bit (larger space makes fragmentation issues less likely).
This needs a lot of memory in one chunk. Tell us about those images? How large are they? Why picturebox (batch processing normally does not need to see the image).Anyhow, this is adefined problem and if thee images are large it is to be expected.
这取决于您如何使用图像。您很可能没有处置相关实例。尝试将您的实例包装在 using 语句中:
That depends on how you are using the images. Chances are that you are not disposing the relevant instance. Try wrapping your instances in a using statement:
查找内存泄漏。您可以通过 gcroot 命令使用 WinDbg。请参阅下面的链接。
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 调试扩展。
以下命令将为您提供内存中类的实例列表及其地址:
然后使用地址调用 GCRoot 并查看内存中对象的引脚:
您可以从 DumpHeap 命令的结果中复制粘贴地址。
Look for memory leaks. You can use WinDbg with gcroot command. See the link below.
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
You need to investigate suspects. You can use SOS debugging extension.
The following command will give you the list of instances of a class in memory and their addresses:
Then call GCRoot with an address and see what pins the object in memory:
You can copy paste the address from the results of DumpHeap command.