2

メモリ リークが発生する VB.NET で記述されたサービスがあります。何もしていないときでも、メモリは成長します。タスク マネージャーで約 29,000 K を使用して開始し、数時間後に、使用状況に応じて 500,000K または 1,000,000K を超えることもあります。一部のお客様では、これによりサーバーでメモリの問題が発生します。サービスには、1 日に 1 回サービスを再起動する自動再起動機能がありますが、これでは不十分な場合があり、1 日に数回、Windows スケジューラからネット停止/起動を使用する必要があります。

PerfMon は、サービスの実行中に「Gen 2 ヒープ サイズ」が増加し続けていることを示していますが、他のヒープ数は増加していません。もちろん、「# Bytes in all heaps」も同様に増加します。これは、その数が含まれているためです。

実行中のサービスのダンプ ファイルを作成し、windbg で開き、SOS をロードし、「!dumpheap -stat」を実行すると、最大数のオブジェクトが「System.WeakReference」クラスになります。私が今見ている例では、合計 4,636,227 個のオブジェクトのうち、4,542,785 個のオブジェクトがあります。

私が読んだことから、これらのオブジェクトは、GC が処理しているオブジェクトへの参照を保持するために GC によって使用されます。もしそうなら、それが終わったときにこれらもGCしないのはなぜですか? WeakReference オブジェクトが保持しているオブジェクトを確認する方法はありますか?

ありがとう!

4

2 に答える 2

2

WeakReferenceオブジェクトへの弱い参照を保持しますが、インスタンスへの参照WeakReferenceは難しいため、多くのデッド ( IsAliveis false) 参照を保持すると、それらは引き続きメモリを使用します。

WeakReferenceリストに保存したり、別の方法で永遠に保存したりしないように注意してください。

編集:参照を自分で保持していない場合、これはVB.NET の問題WithEventsが原因である可能性があります。つまり、リリース モードでアプリケーションをコンパイルすると、 Microsoft に従って問題が修正されるはずです。

于 2012-10-08T13:20:52.243 に答える
0

コード内で WeakReference クラスが無効に使用されているようです。コードを見つけてそのインスタンスを構築するには、プロファイリング ツールを使用します。これにより、割り当ての時点からオブジェクトの有効期間全体を追跡できます (例: dotTrace メモリ)。一部のコレクションから Dead 弱参照インスタンスを消去するのを忘れた人がいます。見つけて修正します。

于 2012-10-08T14:23:59.670 に答える