【发布时间】:2011-08-25 17:45:19
【问题描述】:
我有一个处理大量数据的高性能应用程序。它在很短的时间内接收、分析和丢弃大量信息。这会导致我目前正在尝试优化的大量对象流失,但它也会导致次要问题。当垃圾收集启动时,它会在清理东西时导致一些长时间的延迟(我的意思是 10 到 100 毫秒)。 99% 的时间这是可以接受的,但是对于大约 1-2 分钟的短暂时间窗口,我需要绝对确定垃圾收集不会导致延迟。我知道这些时间段何时会发生,我只需要一种方法来确保在此期间不会发生垃圾收集。该应用程序是使用 .NET 4.0 Framework 用 C# 编写的,如果重要的话,它会使用托管代码和非托管代码。
我的问题是;
- 是否可以暂时暂停整个程序的垃圾收集?
- 是否可以在我需要释放垃圾收集的窗口之前使用 System.GC.Collect() 强制进行垃圾收集,如果这样做,我将在多长时间内释放垃圾收集?
- 人们对最大限度地减少对垃圾收集的总体需求有什么建议?
注意 - 这个系统相当复杂,包含许多不同的组件。我希望避免采用必须在程序的每个类上实现自定义 IDisposable 接口的方法。
【问题讨论】:
-
每个类的自定义
IDisposable实现如何帮助解决您的问题?这些对象在处理后仍然需要进行 GC,不是吗? -
IDisposable与垃圾回收无关。 -
@LukeH - 通过 IDisposable 接口的大量工作,我可以让每个对象检查应用程序是否处于关键时期,并在该时期完成之前阻止最终确定。这种方法需要付出很多努力,并且有很多可能的缺点,但理论上可以使用。一旦关键时期结束,就会从大量突然完成的物体中进行大量清理。不是特别漂亮。
-
@LukeH 使用 IDisposable 接口,您可以在对象完成之前捕获它。此时,您检查程序中的单例引用以确定应用程序是否处于关键路径状态。如果是这样,您将完成短路并将对象添加到清理队列以供以后处理。只要该对象在该清理队列中被引用,它就不会受到 GC 的影响。当关键路径状态完成时,清理队列中的所有对象都被销毁并最终确定。老实说,我根本不喜欢这个,我不确定不会有很大的副作用。这只是一个想法。
标签: c# performance garbage-collection