gpt4 book ai didi

使用应用程序在密集内存中进行 C# 垃圾收集

转载 作者:行者123 更新时间:2023-11-30 15:26:29 25 4
gpt4 key购买 nike

我有一个图像编辑器程序。许多编辑器操作需要在内存中复制图像。图像可能非常大,并且可以在一秒钟内完成多次编辑,因此内存占用非常大。

我准确地 Dispose() 每个未使用的图像。但是当我分析我的应用程序时,我注意到在密集的编辑操作期间内存消耗增长(我什至有几次 OutOfMemoryException)。在几秒钟不活动后,它返回到正常值,因此没有内存泄漏。所以我认为原因是垃圾收集发生的太少了。我在每次编辑操作后放置了 GC.Collect(),这很有帮助,现在内存消耗稳定了。

但是我想知道这是否是一个好方法?根据 MSDN:

It is possible to force garbage collection by calling Collect, but most of the time, this should be avoided because it may create performance issues.

我不需要收集应用程序中的所有内容,而只需销毁几个对象(Bitmap)。我能以某种方式告诉 GC 只收集这些对象吗?或者也许有另一种方法可以优化这个过程?

最佳答案

与垃圾收集器打交道总是一件棘手的事情,在几乎所有情况下都应该避免。

从性能的角度来看,最好的方法是通过重用对象和缓冲区来尽可能避免涉及 GC。这通常是以增加复杂性为代价的,如果可能的话,所以这是一种权衡。

否则推荐的方法是设计您的应用程序以使其易于 GC:

  • 确保在不再需要对象时尽早取消引用它们,以便可以快速收集它们。幸运的话,作为第 0 代或第 1 代。
  • 在取消引用之前对实现它的对象调用 Dispose,以避免 GC 不得不保留对象以调用终结器。

由于我怀疑您已经这样做了,所以剩下的就是彻底的性能测试。如果您不频繁地释放一些大对象,因此 GC 很难预测,间隔时间并且您可以表明如果您调用 GC.Collect(),您的应用程序性能更好(无论这意味着什么),那么继续吧。

据我所知,您无法控制 GC 收集的内容。你甚至不能确定它会在调用 GC.Collect() 时收集你刚刚释放的大对象,如果它们已经进入 GC 第 1 代或第 2 代。这就是为什么你必须测试和测量你的特定用例。

一个问题是,GC 需要几秒钟才能 catch 进度并且内存使用率会下降,这对您的应用程序是否真的很重要?

关于使用应用程序在密集内存中进行 C# 垃圾收集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29454021/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com