0

ANTS Memory Profiler を使用して、アプリケーションのメモリ使用量が増加し続けている理由を特定しようとしています。

アプリケーションを実行し、さまざまなスナップショットを時間の経過とともに取得します。IWbemClassObjectFreeThreaded と ManagementBaseObject のライブ インスタンスが時間の経過とともに増加し続けていることがわかります。クラス リファレンス エクスプローラーを見ると、IWbemClassObjectFreeThreaded が ManagementBaseObject によって参照されており、ManagementBaseObjects の 100% が GC ルートであることがわかりますが、クリーンアップされているようには見えません。他にいつできますか?

4

1 に答える 1

2

これは珍しい問題ですが、発生する可能性があります。WMI は COM ベースです。IWbemClassObject は、RCW ラッパーを取得する COM インターフェイスです。これらのラッパーは、ファイナライザー スレッドが実行されるまでクリーンアップされません。多くの WMI クエリを実行することは技術的に可能ですが、ガベージ コレクターを実行するために結果を十分に処理することはできません。

これを Perfmon.exe、パフォーマンス モニターで診断します。グラフを右クリックし、[カウンターの追加]、[.NET CLR メモリ] の順にクリックして、# Gen 0 Collections カウンターを追加します。下部のリストからプログラムを選択します。プログラムの実行中にカウンターを観察します。刻々と進んでいない場合、この問題が発生します。

このような場合は、コードを見直して、非常に多くのクエリを実行しても、結果をまったくまたはほとんど使用しないことに意味があるかどうかを確認してください。回避策は、それらをカウントし、たとえば 100,000 回ごとに GC.Collect() と GC.WaitForPendingFinalizers() を呼び出すことです。

于 2010-10-05T20:13:45.180 に答える