java -verbose:gc
同じ情報を取得するためのツールまたはコード スニペットに相当するものを探しています。理想的には、これはサービス上で無人で実行し、すべてをファイルに記録できるものです。私のユースケースは、長時間実行されるサービスで GC によって引き起こされるレイテンシーをプロファイリングすることです。
1 に答える
非侵襲的な .NET GC プロファイリングの場合、選択肢はほとんどありません。CLR メモリ パフォーマンス カウンター、CLR メモリ イベント トレース、または一部のプロファイラーを使用できます(SciTech メモリ プロファイラーには、運用環境で CLR プロファイリング データを収集できる優れたコマンド ライン ツールがあります - 他の .NET プロファイルもおそらくそのような機能を公開しています)。 .
パフォーマンス カウンターは侵襲性が最も低い方法だと思いますが、GC の動作に関する詳細な情報は得られませんが、(各世代で) 実行されたコレクションの数と、プロセスが GC に費やした時間を確認できます。 . この情報を収集するには、perfmon、typeperf、またはPowershellを使用できます (以前、perf カウンターを使用するさまざまな方法について説明したことがあります。-パフォーマンスカウンター/ )
ETW イベントは、GC の内部動作に関するより詳細な情報を提供します。ETW プロバイダーを手動で構成するか (たとえば、logman や xperf を使用)、優れたツールPerfView (@Marc がコメントで指摘したように) を使用できます。GC イベントのみに関心がある場合はGC Only
、収集ウィンドウのチェックボックスをオンにします。
CLR GC プロファイリング専用のデフラグ ツールの素晴らしいエピソード (パート 4) があります: http://channel9.msdn.com/Shows/Defrag-Tools/Defrag-Tools-36-CLR-GC-Part-4、私もPerfView のドキュメントを読むだけでなく、他の部分も確認することをお勧めします。PerfView は非常に強力なツールであり、.NET ヒープを分析してメモリ スナップショットを比較することもできます。
最後のオプション (メモリ プロファイラを使用) は、おそらく 3 つの方法の中で最も侵襲的ですが、GC ヒープの詳細が得られる場合があります (特にオブジェクト グラフを分析する場合)。私は良い無料の GC メモリ プロファイラーを思いつかないので、それらのツールの 1 つを入手するにはおそらくお金を払う必要があるでしょう。私は SciTech Memory Profiler を使用した経験があります (これは非常に優れており、前述したように、本番環境でデータを収集できるコマンド ライン クライアントがあります)。また、Visual Studio メモリ プロファイルも試してみました。これは悪くはありませんが、SciTech のものよりも強力ではありません。最後に、JetBrains と RedGate も、.NET 開発者の間でよく知られており、おそらく SciTech に匹敵するメモリ プロファイラを販売しています。