dotMemory JetBrainsを使用してソフトウェアのメモリ消費量を監視しています。Entity Frameworkメモリリーク
リポジトリからクエリを実行すると、ウィンドウを閉じると呼び出し元のオブジェクトが残っていることがわかりました。メモリに私のリポジトリ、私は使用し、私の文脈を処分しても何も..メモリに残っています。私は何を確認できますか?ここで
は、問題のあるコードです:if (creazioneDocumento == null || creazioneDocumento.Count == 0) return;
オブジェクトを思い出しますが、できるだけ早くされていません:デバッグを行う
LoginViewModel.cs
using (DbContext = new Context())
{
var creazioneDocumentoRepository = new RepositoryBase<CreazioneDocumento>(ctx);
var creazioneDocumento = creazioneDocumentoRepository.Lista();
if (creazioneDocumento == null || creazioneDocumento.Count == 0)
return;
var decimaliQuantita = creazioneDocumento.Max(x => x.NumeroDecimaliQuantita);
_NumeroDecimaliQuantita = decimaliQuantita != 0 && decimaliQuantita > 0 ? decimaliQuantita : 0;
var decimaliPrezzo = creazioneDocumento.Max(x => x.NumeroDecimaliPrezzo);
_NumeroDecimaliPrezzo = decimaliPrezzo != 0 && decimaliPrezzo > 0 ? decimaliPrezzo : 3;
_NumeroDecimaliImponibile = 2;
// ctx.Dispose();
}
、私がアップしていることに気づきました私は、オブジェクトがメモリに残っている "最大"を実行します。ここで
がdotmemoryからのスクリーンショットです:
代わりに、このスクリーンショットは参照する方法が何であるかを私に伝えて、メモリに私のloginviewmodelを維持し、私は彼らが2つの最大と信じて:
あなたはGC環境でのメモリリークを証明されていないことを知っていますか?あなたが証明したのは、ガベージコレクションされていないオブジェクトがまだメモリ不足ではないということです。 2回目の測定を行う前に、GCが実行されているという証拠がありません。投票を閉じる - 再版することはできません。 – TomTom
@TomTom dotMemoryがスナップショットを取得すると、ガベージコレクション全体を実行します。したがって、オブジェクトがメモリにある場合、それらはいくつかのルートによって保持されます。 Brux88:LoginViewModel自体のインスタンスではありませんが、クロージャ付きラムダのインスタンスは他の代理人によってメモリ内に保持されています。 LoginViewModelクラスのソースコードなしで何かを言うのは不可能です。 –
実際、私が思ったように。私はメモリを解放する方法を理解していません。問題は私がこの行を実行するときです:var decimaliQuantita = creazioneDocumento.Max(x => x.NumeroDecimaliQuantita); .....私はどのように修正することができますか? – Brux88