防止在短时间内收集.NET垃圾

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

我的问题是;

  1. 是否可以暂时暂停整个程序的垃圾回收?

  2. 是否可以使用System.GC.Collect()强制在我需要免费垃圾收集的窗口之前进行垃圾收集,如果我将多长时间免费使用垃圾收集?

  3. 人们对减少总体垃圾收集有何建议?

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


幕布斯6054654
浏览 618回答 3
3回答

芜湖不芜

GCLatencyMode oldMode = GCSettings.LatencyMode;// Make sure we can always go to the catch block,&nbsp;// so we can set the latency mode back to `oldMode`RuntimeHelpers.PrepareConstrainedRegions();try{&nbsp; &nbsp; GCSettings.LatencyMode = GCLatencyMode.LowLatency;&nbsp; &nbsp; // Generation 2 garbage collection is now&nbsp; &nbsp; // deferred, except in extremely low-memory situations}finally{&nbsp; &nbsp; // ALWAYS set the latency mode back&nbsp; &nbsp; GCSettings.LatencyMode = oldMode;}这将使您能够尽可能多地禁用GC。直到:你打电话 GC.Collect()您设置GCSettings.LatencyMode为除LowLatency操作系统向CLR发送低内存信号执行此操作时请小心,因为当您处于该try块中时,内存使用量可能会急剧上升。如果GC正在收集,则表示这样做是有原因的,只有在系统上有大量内存时,才应认真考虑这一点。关于问题三,如果通过文件系统I / O或网络接收信息,也许可以尝试重用字节数组之类的对象?如果您要将这些信息解析为自定义类,也可以尝试重用它们,但是在不了解您的确切操作的情况下,我不能给出太多好的建议。以下是一些MSDN文章也可以提供帮助:延迟模式约束执行区(这就是我们称之为PrepareConstrainedRegions())的原因注意: GCSettings.LatencyMode = GCLatencyMode.LowLatency只能在设置GCSettings.IsServerGC == false。IsServerGC可以更改为App.config:&nbsp; <runtime>&nbsp; &nbsp; <gcServer enabled="false" />&nbsp; </runtime>
打开App,查看更多内容
随时随地看视频慕课网APP