ええ、ガベージコレクタはオブジェクトを使用しなくなったら解放します。私たちは通常、.NETのメモリリークを呼び出して何
は、より多くのようなものです:
- あなたは(ごみ収集されません)外部リソースを使用して、それらを解放するために忘れています。これは通常、IDisposableインターフェイスを実装することで解決されます。
- 与えられたオブジェクトへの参照はないと思いますが、ガベージコレクタはこれ以上使用していません。
さらに、メモリは必要なときにのみ再利用されます。つまり、ガベージコレクタは指定された時間にアクティブ化され、解放可能なメモリを特定して解放するコレクションを実行します。それまでは、メモリは要求されていないので、メモリが失われているように見えます。
ここでは、明確にするために、より複雑な回答を提供するつもりです。
まず、ガベージコレクタは独自のスレッドで実行されます。メモリを回収するためには、ガベージコレクタが他のすべてのスレッドを停止して、参照チェーンに従うことができ、何に依存するかを判断する必要があることを理解する必要があります。それがメモリがすぐに解放されない理由です。ガベージコレクタはパフォーマンスにある程度のコストがかかることを暗示します。
ガベージコレクタは内部的に世代ごとにメモリを管理します。非常に簡略化された方法では、長命、短命、および大きいサイズのオブジェクトの世代がいくつかあります。ガベージコレクタは、オブジェクトがある世代から別の世代に移動するたびにオブジェクトを移動させます。これは、長命の世代では短期間の世代でより頻繁に発生します。また、オブジェクトを再割り当てして、可能な限り連続した領域を確保します。コレクションを実行するには、コストのかかるプロセスです。
フォームを解放したときの効果を実際に見たい場合(範囲外になり、参照がなくなるとき)、GC.Collect()
を呼び出すことができます。テストのためだけに行います。あなたが行っている作業とその影響を正確に把握しているケースを除いて、Collectを呼び出すことは非常に賢明ではありません。
さらに、IDisposeインターフェイスのDisposeメソッドについて説明します。
Disposeは通常のC++の方法ではデストラクタではなく、デストラクタではありません。 Disposeは、に、アンマネージドオブジェクトを確定的に取り除く方法です。例:何かしているために1GBのメモリを割り当てる外部COMライブラリを呼び出すとします。 Disposeを持たない場合はメモリがそこにあり、GCがコレクション内に入るまでのスペースを無駄にし、実際のオブジェクトデストラクタを呼び出すことによってアンマネージメモリを再利用します。したがって、すぐにメモリを解放したい場合は、Disposeメソッドを呼び出す必要がありますが、強制することはありません。
IDisposableインターフェイスを使用しない場合は、Finalizeメソッドで管理されていないリソースを解放する必要があります。 GCがオブジェクトの再生を試みると、オブジェクトデストラクタからFinalizeが自動的に呼び出されます。したがって、適切なファイナライズ方法がある場合、アンマネージメモリはいずれの方法でも解放されます。 Disposeを呼び出すと、確定的になります。
メモリがリークしていることをどのように知っていますか? – Dmitry
私はタスクマネージャのメモリに従っていました。私が下で作った他の2つのコメントを見てください。多分それは "漏れ"ではないが、それでもそれは迷惑である。 – Procule
@Procule - CLR GCが動作するかどうか心配する必要があります。します。多くのC/C++コーダーがこれを使用しており、本当に満足しています。ただし、使用する/ IDisposableパターンについて学び、ドキュメントをチェックして、オブジェクトがIDisposableを実装しているかどうかを確認する必要があります。しかし、.NETの大きな利点は、この種のものを微調整することではありません。 – overslacked