メモリ リークが発生する 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 オブジェクトが保持しているオブジェクトを確認する方法はありますか?
ありがとう!