Dot-Net

.NET 垃圾收集延遲

  • January 28, 2011

我正在使用記憶體分析器、dotTrace 和 perfmon 計數器來分析 C# 應用程序中的記憶體。我無法回答的一個問題是:垃圾收集在我的應用程序中導致的最大延遲是多少?我可以通過使用垃圾收集中的 % time 來獲得一個近似值,但是有沒有辦法為單個收集計時?

看起來您在問 2 個問題 1- GC 是否有最大延遲?2-如何計時個人GC收集?

對於 #1,GC 吞吐量大約為 200MB/秒/堆。這意味著 GC 能夠在 1 秒內收集大小為 100MB 的堆。perheap 概念是因為伺服器 GC,因為我們為每個 CPU 創建 1 個堆。

所以,如果你有一個巨大的堆,你會看到很大的延遲。請記住,當 GC 收集記憶體時,它會以短暫的方式執行此操作,因此與完整 GC 收集相比,Gen0/Gen1 收集非常便宜。

在 .NET 4.0 中,我們添加了一個功能來最小化客戶端應用程序的 GC 延遲,該功能在 GC Concurrent 模式下預設啟用。在這種模式下,我們嘗試在應用程序執行時在後台執行緒中收集堆。這會為客戶端應用程序帶來更好的暫停時間

For#2:我們在稱為 ETW 的 .net 框架中有一個非常強大的跟踪(它在 Windows 中可用,我們在 CLR 中利用它)。ETW 代表Event Tracing For Windows (。我們在 GC 即將開始和 GC 完成時觸發 ETW 事件。使用這些 ETW 事件,您可以計算每個 GC 花費的時間。

有關詳細資訊,您可以參考CLR ETW 參考。此外,對於允許您處理 ETW 事件的良好託管庫,請查看TraceEvent

希望這有幫助。謝謝

引用自:https://stackoverflow.com/questions/4821323