21

サービスのメモリ リークの問題を確認したい。次の一連の perfmon カウンターを試しました。

  1. .NET CLR メモリ\# すべてのヒープのバイト数
  2. .NET CLR メモリ\Gen 2 ヒープ サイズ
  3. .NET CLR メモリ\# GC ハンドル
  4. .NET CLR メモリ\固定されたオブジェクトの数
  5. .NET CLR メモリ\# コミットされた総バイト数
  6. .NET CLR メモリ\# 合計予約済みバイト数
  7. .NET CLR メモリ\ラージ オブジェクト ヒープ サイズ

ここから上記のセットを参照しました

次のセットも参照:

  1. メモリ/使用可能なバイト
  2. メモリー/コミット済みバイト
  3. プロセス/プライベート バイト
  4. プロセス/ページ ファイル バイト
  5. プロセス/ハンドル数

ここから上記のセットを参照しました

パラメータ/基準、またはメモリ リークの perfmon カウンタを特定するためのその他の最良の方法はありますか?
メモリリークをチェックするためのカウンターのセットを提案できますか? または上記のセットはメモリリークをカバーしていますか?

4

2 に答える 2

33

パフォーマンス モニターを使用してメモリ リークを検出するには、次のカウンターを監視します。

  1. Memory/Available Bytes カウンタを使用すると、使用可能なメモリの合計バイト数を表示できます。通常、この値は変動しますが、アプリケーションでメモリ リークが発生している場合は、時間の経過とともに減少します。
  2. TheMemory/Committed Bytes カウンタは、メモリ リークが発生している場合、着実に上昇します。これは、使用可能なメモリのバイト数が減少すると、コミットされたバイト数が増加するためです。
  3. Process/Private Bytes カウンタには、特定のプロセス専用に予約されているバイト数が表示されます。メモリ リークが発生している場合、この値は着実に上昇する傾向があります。
  4. Process/Page File Bytes カウンターは、ページファイルのサイズを表示します。Windows は仮想メモリ (ページファイル) を使用して、マシンの物理メモリを補足します。マシンの物理メモリがいっぱいになり始めると、メモリのページがページファイルに移動されます。メモリが十分にあるマシンでも、ページファイルが使用されるのは正常です。しかし、ページファイルのサイズが着実に増加している場合は、メモリ リークが発生している良い兆候です。
  5. Process/Handle Count カウンターについても言及したいと思います。アプリケーションはハンドルを使用して、アクセスする必要があるリソースを識別します。メモリ リークが発生している場合、アプリケーションは多くの場合、メモリ リソースを識別するために追加のハンドルを作成します。そのため、ハンドル数の増加はメモリ リークを示している可能性があります。ただし、すべてのメモリ リークがハンドル数の増加につながるわけではありません。

ソース

私の経験では、これは正確です。

Microsoft の従業員である Tess による Microsoft Advanced Debugging ブログも参照してください。次のカウンターを提案する人。上記はメモリリークが存在することを示すのに十分すぎることを発見しましたが、テスの指示が問題についてより詳細な洞察を提供できると信じています.

デモのデバッグ - メモリ レビュー

  • .NET CLR メモリ/すべてのヒープのバイト数
  • .NET CLR メモリ/大きなオブジェクト ヒープ サイズ
  • .NET CLR メモリ/Gen 2 ヒープ サイズ
  • .NET CLR メモリ/Gen 1 ヒープ サイズ
  • .NET CLR メモリ/Gen 0 ヒープ サイズ
  • プロセス/プライベート バイト
  • プロセス/仮想バイト
于 2013-04-04T14:07:56.053 に答える
4

RedGate ANTS Memory ProfilerJetBrains dotMemory Profilerなど、メモリ リークのテストを容易にするためのより優れたツールを利用できます。

ただし、パフォーマンス カウンターを使用する場合は、 この記事でパフォーマンス カウンターを使用してメモリ リークをテストする方法について説明します。

ガベージ コレクションは、インスタンスが破棄された直後にメモリを解放しないことに注意してください。メモリ ストレスがある場合にのみメモリをトリガーして解放するように最適化されています。そのため、メモリ リークをテストする場合は、カウンターを読み取る前にガベージ コレクションを手動で実行する必要があります。

GC.Collect();
GC.WaitForPendingFinalizers();

ここに画像の説明を入力

于 2015-07-26T01:27:44.123 に答える