4

私は最近、大量のスループット (1 日あたり 6,000 万以上のリクエスト) を処理する小さなサービスを作成しましたが、メモリの問題が発生しています。最初に、非常に有用な非常にパフォーマンス指向の ServiceStack ライブラリに関係するものではなく、私が書いたものでなければならないと確信していた通常の容疑者をすべて調べました。しかし、運用サーバーで !dumpheap -stat に windbg を使用すると、驚いたことに、メモリ内のオブジェクトの大部分が System.WeakReference 型であり、!gcroots が ServiceStack の Funq コンテナーを指していることがわかりました。

私は自分のサービスで IoC 化されたデータ構造を使用していないので、なぜこれが起こっているのか疑問に思っていました。何かを間違って初期化していますか? 私の apphost 初期化クラスは、アセンブリと名前の情報を使用して基本コンストラクターを呼び出すだけで、Configure メソッドをまったくオーバーライドしません。

public SvcName() : base("SvcName", typeof(SvcName).Assembly) { }

Visual Studio が「エディット コンティニュ」デバッグ オプションをオンにしてバイナリをコンパイルしているため、まれに System.WeakReference オブジェクトが .NET によって挿入されることがよくあることを他の場所で読みましたが、私の VS でそれをオフにしても効果はありません (おそらくSS バイナリは既にコンパイルされており、私のプロジェクトで参照されているだけです)。

他の誰かがこの問題を抱えたことがありますか?

4

1 に答える 1

2

WeakReference は Funq で使用され、使い捨ての WeakReference スタックにIDisposable保存されているものを追跡します。基本的に、Funq は作成されたすべての WeakReference を追跡するため、Container が破棄されるときにすべて破棄できます。IDisposable

最初にインスタンスの使用を減らすことができるかどうか (たとえば、シングルトンを増やすなど) を検討します。それ以外の場合は、代わりにIDisposable使用するように Funq ソース コードを変更してみてください。問題が解決する場合は、opt を含めることができます。の代わりに使用する ServiceStack の -in オプション。Stack<IDisposable>Stack<WeakReference>Stack<IDisposable>Stack<WeakReference>

于 2013-01-16T00:06:21.053 に答える