【发布时间】:2015-04-05 04:18:17
【问题描述】:
我有一个图像编辑器程序。许多编辑器操作需要在内存中复制图像。图片可能非常大,一秒钟内可以进行多次编辑,因此内存使用量很大。
我准确地Dispose() 每个未使用的图像。但是当我分析我的应用程序时,我注意到在激烈的编辑操作期间内存消耗增长(我什至得到了OutOfMemoryException 几次)。在几秒钟不活动后,它会恢复到正常值,因此没有内存泄漏。所以我认为原因是垃圾收集发生得太少了。我在每次编辑操作后都输入了GC.Collect(),它有帮助,现在内存消耗稳定了。
但是我想知道这是否是一个好方法?根据 MSDN:
可以通过调用 Collect 来强制进行垃圾回收,但大多数情况下应该避免这样做,因为它可能会产生性能问题。
我不需要收集应用程序中的所有内容,只需销毁几个对象(Bitmap's)。我可以以某种方式告诉 GC 只收集这些对象吗?或者也许有另一种方法来优化这个过程?
【问题讨论】:
-
你不能重复使用位图,这样你就不必一直创建新的了吗?
-
Bitmap 类是单一的 .NET 类,它提醒您调用 Dispose() 很重要。错过一个,您的程序因 OOM 导致的可能性显着增加。该类完全太小(24 字节),无法自行及时触发 GC。内存分析器往往没有帮助,它只会向您显示您使用了位图(您已经知道它确实如此)和一大块没有详细信息的非托管内存。需要进行彻底的代码审查才能找到错误。在这里无法获得帮助。
标签: c# garbage-collection