2016-04-02 23 views
0

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からのスクリーンショットです:

enter image description here

代わりに、このスクリーンショットは参照する方法が何であるかを私に伝えて、メモリに私のloginviewmodelを維持し、私は彼らが2つの最大と信じて:

enter image description here

+0

あなたはGC環境でのメモリリークを証明されていないことを知っていますか?あなたが証明したのは、ガベージコレクションされていないオブジェクトがまだメモリ不足ではないということです。 2回目の測定を行う前に、GCが実行されているという証拠がありません。投票を閉じる - 再版することはできません。 – TomTom

+0

@TomTom dotMemoryがスナップショットを取得すると、ガベージコレクション全体を実行します。したがって、オブジェクトがメモリにある場合、それらはいくつかのルートによって保持されます。 Brux88:LoginViewModel自体のインスタンスではありませんが、クロージャ付きラムダのインスタンスは他の代理人によってメモリ内に保持されています。 LoginViewModelクラスのソースコードなしで何かを言うのは不可能です。 –

+0

実際、私が思ったように。私はメモリを解放する方法を理解していません。問題は私がこの行を実行するときです:var decimaliQuantita = creazioneDocumento.Max(x => x.NumeroDecimaliQuantita); .....私はどのように修正することができますか? – Brux88

答えて

0

.NET CLRは、ガベージコレクションされた管理対象のランタイム/仮想マシンです。

不要であるとすぐにオブジェクトをメモリから回収して削除することは期待できません。

一方、IDisposable.Disposeは、インプリメンテーションで使用される基になるリソースを解放するためのコードを定義する単なるインタフェースメソッドです。メモリを解放するビルトインメソッドではありません。

ガベージコレクタ(GC)はバックグラウンドプロセスとしてメモリを再利用し、瞬時には何も削除しませんが、時間外の仮定に基づいています。

さらに読書:Understanding garbage collection in .NET

+0

、IDisposable.Disposeであなたがアンマネージリソースを解放していることを確認する必要があります。しかし、あなたの場合には、接続および関連リソースが解放されませんので、プールされているDBMSへの接続を持っています。ストレステストを実行してメモリをプロファイリングする場合、管理対象オブジェクトの場合、おそらく鋸歯状が見えます。 – bubi

+0

メモリプロファイラは、メモリのスナップショットを取得するために、完全なガベージコレクションを行います –