Windows サービスで Funq を使用していくつかのスケジュールされたタスクを実行しています。各ラウンドでは、すべてのオブジェクトを作成するよりも子コンテナーを作成しており、最後に子コンテナーを破棄しています。この子コンテナーによって作成された要素は GC ではないことがわかりました。ルート コンテナには、子コンテナの破棄を呼び出した後もそこにとどまる子コンテナのコレクションがあります。このコードは問題を再現し、800MB のメモリを消費 (および保持) します。
私たちにとっては非常に驚きました。このように funq を使用するのは間違ったパターンなのでしょうか?この場合、どのように使用すればよいのでしょうか? それとも単なるバグですか?
ありがとう
public class Dummy
{
public string Content { get; set; }
public void Generate(int size)
{
this.Content = new string('X', size);
}
}
class Program
{
static void Main(string[] args)
{
var container = new Container();
container.RegisterAutoWired<Dummy>().ReusedWithin(ReuseScope.Container);
int size = 20000;
for (int i = 0; i < size; i++)
{
using (var c = container.CreateChildContainer())
{
var d= c.Resolve<Dummy>();
d.Generate(size);
}
PrintInfo(i);
}
Console.ReadLine();
}
private static void PrintInfo(int i)
{
if (i%1000 == 0)
{
int divide = 1024*1024;
GC.Collect();
var p = System.Diagnostics.Process.GetCurrentProcess();
Console.WriteLine(p.WorkingSet64/divide + "MB");
Console.WriteLine(p.PrivateMemorySize64/divide + "MB");
}
}
}