2013-06-21 40 views
1

我正在尋找相當於java -verbose:gc或任何工具或代碼片段來獲取相同的信息。理想情況下,這將是我可以在服務上以無人看管的方式運行並將所有內容記錄到文件中。我的用例是分析長時間運行的服務中GC引起的延遲。如何在CLR/.Net中記錄所有垃圾收集事件?

+0

Microsoft的PerfView可能會提供此信息。 –

回答

3

對於無創性.NET GC分析,您有幾個選項。您可以使用CLR Memory Performance CountersCLR Memory Event Tracing或某個分析器(SciTech內存分析器有一個很好的命令行工具,允許您在生產環境中收集CLR分析數據 - 其他.NET配置文件可能也會公開此類功能)。

我想性能計數器是最不具有侵入性的方法,但它們並沒有給你關於GC工作的詳細信息 - 雖然你可以看到有多少集合被執行(在每一代中)以及多少將您的流程花費在GC上。要收集這些信息,您可以使用性能監視器,typeperf或Powershell的(我曾經描述了使用Perf Counters的,所以你可以看看不同的方式:http://lowleveldesign.wordpress.com/2012/04/19/diagnosing-applications-using-performance-counters/)提供GC內部運作更加細節

ETW事件。您可以手動配置ETW提供程序(例如使用logman或xperf)或使用出色的工具PerfView(正如@Marc在註釋中指出的那樣)。如果你只在GC活動感興趣,請GC Only複選框中收集到了Windows:

enter image description here

有磁盤整理工具的一大發作致力於CLR GC分析(第四部分):http://channel9.msdn.com/Shows/Defrag-Tools/Defrag-Tools-36-CLR-GC-Part-4,我也建議你檢查其他部分以及閱讀PerfView文檔。 PerfView是一個非常強大的工具,它甚至可以讓你分析.NET Heap並比較內存快照。

最後一個選項(即使用內存分析器)可能是三種方法中最具侵入性的方法,但有時可能會給您更多關於GC堆的詳細信息(特別是當您想分析對象圖時) 。我想不出任何好的免費GC內存分析器,所以你可能需要付費購買這些工具之一。我有一些SciTech Memory Profiler的經驗(這很好,正如我之前提到的,他們有a command line client可以讓你收集生產數據)。我也嘗試過Visual Studio內存配置文件 - 它並不差,但比SciTech更強大 - 最後,JetBrains和RedGate還銷售內存分析器,這些分析器在.NET開發人員中很有名,可能與SciTech相媲美。

+0

我對Windows開發相當陌生,所以這是非常有用的信息! – Ramon