亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

防止在短時間內收集.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 關注
  • 734 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號