2009-08-27 20 views
2

私は子フォームを持つMDIを持っています。子フォームはDataGridViewです。私は、DataGridビューに膨大な量のデータをロードします。私は子供を閉じると処分方法を形成し、私はメモリが下がらないフォームを閉じると、私はDataGridViewのに.NETメモリリーク?

this.dataGrid.Dispose(); 
    this.dataGrid = null; 

を配置すると呼ばれています。私は.NET memory profilerを使用してメモリ使用量を追跡します。私は最初にデータグリッドを読み込んで(予期したとおりに)読み込みが完了したときに一定になると、メモリ使用量が高くなることがわかります。

フォームを閉じると、それでも一定のままです。しかし、私がメモリプロファイラーを使ってメモリのスナップショットを撮ると、ファイルをロードする前の状態になります。メモリスナップショットを取得すると、強制的にガベージコレクタが実行されます。

何が起こっていますか?メモリリークはありますか?またはガベージコレクタを強制的に実行する必要がありますか?

詳しい情報

私はもはや情報が必要なフォームを閉じるしています。だから私はデータへの参照を保持していない理由です。

更新

それは私が一度にすべてのデータをロードするための必要条件です。私は何かが間違っているとガベージコレクタは実行されていないが、私はプロファイラーを見ているときにそれが表示されますが、それは、スナップショットは、メモリ使用量が減少します。だから私は何が起こっているのか理解できません。

+0

どのような種類のオブジェクトからデータをロードしていますか? – RichardOD

+0

私はそれをDataViewにバインドしています –

答えて

-2

これは、メモリリークを追跡するための便利なツールです:

SysInternals Process Explorer

+0

-1 .NETメモリプロファイラ(OPが現在使用しているもの)は、マネージコードのメモリリークを見つけるのにはるかに優れています。 – Niki

5

これは正常です。ガベージコレクタは、必要に応じて独自の時間で実行されます。ガベージコレクタが強制終了されたときに正常に戻るという事実は、物事を守っているリークや永続的な参照がないことを意味します。

本当の質問は次のとおりです。ガベージコレクタを実行する必要がありますか?物理的に持っているより多くのRAMを使用していますか?もしそうでなければ、本当にあなたは他の何も必要としない物理RAMの束を使用していますか?

本当に良い質問は、実際にアプリケーションにデータをすべてロードする必要がありますか?しかし、それ以上の情報なしでそれに答える方法はありません。

2

ガベージコレクションは、参照をnullにしただけでは発生しません。オブジェクトがもはや参照ではなくなった場合、それはある時点で収集されます。ちょっと待っていても、メモリリークがあるわけではありません。さらに、ガベージコレクトを実行しても、メモリは必ずしもすぐにOSにリリースされるわけではないので、アプリケーションのメモリ使用量が低下することはありません。

6

変数をnullに設定しても、ガベージコレクタが強制的に呼び出されることはありません。 GC処理は高価なプロセスであり、絶対に必要でない限り避けるべきです。したがって、コレクタはスケジュールされているとき、必要なときにのみ実行されます。

あなたが本当にあなたのデータグリッドをゼロにした後、手動でガベージコレクタを起動し、そのメモリが解放されていることを確認する必要がある場合:

しかし
this.dataGrid.Dispose(); 
this.dataGrid = null; 
GC.Collect(); 

、マシューScharleyが述べたように、CLR場合それは本当に問題ではありませんその記憶を保持していますか?強制的に解放すると、次にDataGridにデータが読み込まれ、CLRは同じ量のメモリを再割り当てする必要があります。これは遅いです。

DataGridがコンピュータ上の物理メモリと同じかそれ以上の物理メモリを消費している場合を除き、CLRだけを残しておいてください。

+1

もう一つは、たとえメモリを保持していても、それが何も参照しないと、GCが実行されて収集されるまでページアウトされ、ハードドライブに座ってしまうことになります。 –

-1

GC.WaitForPendingFinalizers(); - それが私を助けました。

関連する問題