私のアプリでメモリリークをデバッグしようとしていましたが(関連記事question参照)、間違った動作が発生しました。このコード(もちろん簡略スニペット)でIServiceProviderガベージコレクション/廃棄
:
while (true)
{
using (var context = _serviceProvider.GetRequiredService<IDataContext>())
{
Console.WriteLine("Hello");
}
}
メモリ消費が急速を成長させます。
私がサービススポーンをコメントアウトすると、メモリ消費は安定しています。
while (true)
{
// using (var context = _serviceProvider.GetRequiredService<IDataContext>())
// {
Console.WriteLine("Hello");
// }
}
サービスは過渡として登録されました。
私の理解では、using
はサービスの廃棄に関する責任を負います。 var context
はwhile
の範囲で作成され、新しい反復が始まると破棄する必要があります。
私の最初の考えは、GCはちょうどその仕事を十分にやっていないのですが、消費されるメモリの量が増えると頻度が増えることはありませんでしたか?
なぜ私は間違っていますか?
GCはこれまでに収集されますか? – khargoosh
@khargooshそうすべきではないようです。問題はその理由です。 –
'_serviceProvider'が' IDisposable'を正しく実装していないか、リソースを解放していない可能性はありますか?あなたはいつでも例外を受け取りますか? – khargoosh