2017-09-10 91 views
0

C#プログラムのメモリ使用量を処理しています。メモリリークを発見するために、アプリケーションの開始点と終了点の間にメモリコントロールを設定しました。 FirebirdのとEntity Frameworkの6を使用しているとき、私は警告しました:Entity Frameworkはメモリを解放しませんか?

var m = GC.GetTotalMemory(true)/1024/1024; // 2MB 

using (Entities context = new Entities(ConnectionString)) 
{ 
    m = GC.GetTotalMemory(true)/1024/1024; //2MB 
    context.MYTABLE.FirstOrDefault(); 
    m = GC.GetTotalMemory(true)/1024/1024; // 5MB 
} 

m = GC.GetTotalMemory(true)/1024/1024; // 5MB ?? 

context.MYTABLE行をコメントアウトすることで、メモリは2メガバイトのままになります。

私はアプリケーションが終了するときにすべてが破棄されることは知っていますが、私は自分のオブジェクト上でメモリリークを検出したいと思います。

EFで使用されているこの余分なメモリを処分する方法はありますか?

この問題は、Firebird EFドライバによって発生する可能性がありますか?

ティア

+0

細かい点でメモリの割り当てと解放を制御しない世界では、小さなコードブロックで使用されるメモリを測定することはあまり意味がありません。 EFは物事をスピードアップするために物事を記憶しており、そのことを試してはいけません。 – Steve

+0

'Debug'または' Release'ビルドを実行していますか? – mjwills

+1

同じコードを2番目、3番目などの時間に測定してみましたか?最初のEFはメタデータ・モデルを構築し、キャッシュするためです。 –

答えて

0

EFで使用されているこの余分なメモリを処分する方法はありますか?

なし - に余分なメモリが道を保証リリースに方法はありません。

documentationGetTotalMemory(true)ための状態:

備考 forceFullCollectionパラメータがtrueの場合、システムながら戻す前に短い間隔を待つ この方法は ごみを収集し、オブジェクトを確定。この間隔の持続時間は、ゴミの数が の収集サイクルが完了し、サイクル間に回復されたメモリ量の変化によって決定される、 の内部指定の制限です。ガベージコレクタは、すべてのアクセスできないメモリが収集されることを保証しません。 特に最後の文で

注:

ガベージコレクタは、すべてのアクセス不可能なメモリを収集する を保証するものではありません。これの上に

、Entity Frameworkの(及び/又はFirebirdのドライバが)おそらくアプリケーションの寿命のためにRAM内にキャッシュされ、いくつかの情報を保持しています。そして、その中には決してGCされないものもあります。

+0

ありがとうございます。私は余分なメモリを私のメモリリーク検出に含めました。 –

3

contextDisposeメソッドが呼び出されることのみ保証を使用して)usingブロックを終了した後に実行するガベージコレクタのための理由はありません。 GC.Collect()を使用してガベージコレクションを強制することができます。

より一般的には、EFを使用して読み込まれるエンティティは、コンテキストから手動で削除しない限り、関連付けられているコンテキストの間存続します。

EFのFirebirdドライバでメモリリークを話すことはできませんが、あなたが見ているのは期待通りです。

+1

'GetTotalMemory(true)'は 'GC.Collect'を行うことになっています。明示的にコレクションを追加しても何も変更されません。 –

関連する問題