c# - 短时间内防止 .NET 垃圾收集

标签 c# performance garbage-collection

我有一个处理大量数据的高性能应用程序。它在很短的时间内接收、分析和丢弃大量信息。这会导致我目前正在尝试优化的大量对象流失,但它也会导致次要问题。当垃圾收集启动时,它会在清理时造成一些长时间的延迟(我指的是 10 到 100 毫秒)。 99% 的时间这是可以接受的,但是对于大约 1-2 分钟的短暂时间窗口,我需要绝对确保垃圾收集不会导致延迟。我事先知道这些时间段何时会发生,我只需要一种方法来确保在此期间不会发生垃圾收集。该应用程序是使用 .NET 4.0 Framework 以 C# 编写的,并且在需要时同时使用托管和非托管代码。

我的问题是;

  1. 是否可以为整个程序短暂暂停垃圾收集?
  2. 是否可以使用 System.GC.Collect() 在我需要免于垃圾收集的窗口之前强制进行垃圾收集,如果我这样做,我将在多长时间内免于垃圾收集?
  3. 人们对最大限度地减少垃圾收集的整体需求有什么建议?

注意 - 这个系统相当复杂,有很多不同的组件。我希望避免采用必须在程序的每个类上实现自定义 IDisposable 接口(interface)的方法。

最佳答案

.NET 4.6 添加了两个新方法:GC.TryStartNoGCRegionGC.EndNoGCRegion就是为了这个。

关于c# - 短时间内防止 .NET 垃圾收集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6005865/

相关文章:

c# - 在 WPF 中重用触发条件或多重绑定(bind)

c# - 可以动态接受控制台命令的 Windows 服务应用程序

c# - 通用类型转换为原始类型

c# - 如何将 Complex 转换为 double

c++ - 什么时候在不牺牲正确性的情况下有意识地利用未指定的行为会带来好处?

java - 详细 JVM 垃圾收集日志的时间戳是收集的开始还是结束?

java - 读/写效率

mysql - 如何像关系表一样检索 MySQL EAV 结果

javascript - 我应该担心清理 Node.js 中的大对象还是留给垃圾收集器?

java - Cassandra 2.1 集群显示出持续较高的 CPU 使用率和缓慢的响应