为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

幕布斯6054654 2019-10-09 15:25:34
我有一个高性能的应用程序,正在处理大量数据。它正在非常短的时间内接收,分析和丢弃大量信息。这会导致大量对象流失,而我目前正在尝试优化该对象流失,但同时也会导致第二个问题。当垃圾回收启动时,它可能会导致清理过程变长(很长一段时间,我的意思是10到100毫秒)。99%的时间是可以接受的,但是对于大约1-2分钟长的短暂时间,我需要绝对确保垃圾回收不会造成延迟。我知道这些时间段何时会提前发生,我只需要一种方法来确保在此期间不会发生垃圾收集。该应用程序是使用.NET 4用C#编写的。我的问题是;是否可以暂时暂停整个程序的垃圾回收?是否可以使用System.GC.Collect()强制在我需要免费垃圾收集的窗口之前进行垃圾收集,如果我将多长时间免费使用垃圾收集?人们对减少总体垃圾收集有何建议?注意-该系统相当复杂,具有许多不同的组件。我希望避免使用必须在程序的每个类上实现自定义IDisposable接口的方法。
查看完整描述

3 回答

?
芜湖不芜

TA贡献1796条经验 获得超7个赞

GCLatencyMode oldMode = GCSettings.LatencyMode;


// Make sure we can always go to the catch block, 

// so we can set the latency mode back to `oldMode`

RuntimeHelpers.PrepareConstrainedRegions();


try

{

    GCSettings.LatencyMode = GCLatencyMode.LowLatency;


    // Generation 2 garbage collection is now

    // deferred, except in extremely low-memory situations

}

finally

{

    // ALWAYS set the latency mode back

    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:


  <runtime>

    <gcServer enabled="false" />

  </runtime>


查看完整回答
反对 回复 2019-10-09
  • 3 回答
  • 0 关注
  • 680 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信