2015-11-12 2 views
7

ダンプファイルをキャプチャして(WinDbgなどで)解析すると、ダンプ・ファイルが収集されたときにプロセスがGCの途中にあったため、データが正確でないか、またはコマンドにアクセスできない可能性があります。.NETがガベージコレクション(GC)の途中にないときに.NETプロセスのプロセスメモリダンプを取得する方法

メモリ分析を実行すると、プロセス上のメモリが高く、メモリー圧が高く、.NETからGCに頻繁に強制されるためです。

GCでダンプを取らないようにするにはどうすればよいですか?ダンプファイルを安全に取り込めるかどうかを知る方法はありますか?

+2

この問題を考慮して設計されたPerfViewを使用できます。ヘルプ|ユーザーガイドに「GCヒープコレクション:フリーズするかどうか」というセクションがあります。これについて議論する。ダウンロードリンクは次のとおりです。http://www.microsoft.com/en-us/download/details.aspx?id=28567&hl=ja –

+0

私の答えを実装/テストして助けが必要な場合は、私の行を削除してください。 –

+0

@マーク:あなたのアプリケーションでは、バックグラウンドプロセスはありますか?つまり、ユーザーが使用していない場合でも、シーンの裏側で何かを処理できますか? – CharithJ

答えて

4

私はこの分野の専門家ではありませんが、興味深いものを監視するために.NETランタイムのパフォーマンスカウンタを使用できることに気付きました.1つはガベージコレクタによって割り当てられたバイト数ですそれが最後のコレクションの間に。 Allocated Bytes/secondPerformance Counters in the .NET Frameworkにおける状態の 説明:

は、ガベージコレクションのヒープに割り当てられた1秒あたりのバイト数を表示します。このカウンタは、すべてのガベージコレクションの最後に更新され、各割り当てでは更新されません。このカウンタは時間の経過と共に平均値ではありません。最後の2つのサンプルで観測された値の差をサンプル間隔の継続時間で割った値を表示します。

あなたは1秒にパフォーマンスモニタの更新間隔を設定し、Allocated Bytes/secondのための指標をよく見て取れば私のテストによると、収集が完了した後に0の値を示しているようです。コレクションが進行中であるかどうかにかかわらず、この値から導き出すことができます。

VS 2015の小さなアプリケーションを作成して確認しました。このアプリケーションでは、ガベージコレクションが進行中かどうかを表示できます。その場合、指標の値は0とは異なっていた。

更新(感謝トーマス)

パフォーマンスカウンタを監視するためのProcDumpを使用して、自動化された方法でダンプを作成することが可能です。 これを行う正しい方法は、procdump ProcessName -s 1 -ma -pl "\.NET CLR Memory(ProcessName)\Allocated Bytes/second" 1000です。値が1000を下回ると、ダンプがトリガーされます。

ガベージコレクションが実行されていない場合、値がゼロになるため、これは機能するはずです。

オペレーティングシステムの英語版で動作していない場合は、パフォーマンスカウンタの正しい言語固有の名前を調べる必要があります(上記のMSDNリンクを見て、別のそこに言語)。例えば。ドイツ語の名前は 、"\.NET CLR-Speicher(ProcessName)\Zugeordnete Bytes/Sek."となります。

+0

答えをありがとう。あなたは答えをもう少し実践できますか? '-pl'スイッチで[ProcDump](https://technet.microsoft.com/en-us/sysinternals/dd996900.aspx)を使うことができますか?もしそうなら、どちらですか?理論を証明するためのサンプルコードを提供できますか? –

+1

更新された回答ありがとうございます。私はそれを試してみましょう。 –

+0

@トーマス賞金ありがとう;-) –

関連する問題