Population
というリストがあります。これは非常に多くのポジションの素晴らしいリストであり、ある時点で使用をやめます。リソースを解放するにはどうすればよいですか?次に、これはコードの一部です。
private List <BasePopulation> Population=new List <BasePopulation>();
Population.SomeMethod();
Population.Clear();
Clearメソッドを使用しましたが、動作しません。何か案が?
問題は、Clear
が思っているとおりに動作していないことです。 Clear
は、バックグラウンドで使用する内部配列のサイズを変更せずに、単にList
を空としてマークします。ただし、個々のBasePopulation
インスタンスへの参照はすべて削除されます。したがって、他のデータ構造にそれらへの参照がない場合、それらはガベージコレクションの対象となります。しかし、notはList
のサイズを直接縮小します。 ILSpyを使用してこれを確認しました。
2つのオプションがあります。
セットする Population = null
。これにより、オブジェクトインスタンス全体のルートが解除され、ガベージコレクションの対象になります。
このTrimExcess
でList
を呼び出します。これにより、内部配列のサイズが変更されます。
ガベージコレクター(GC)がメモリ管理を処理しているため、最初にできることは、GCがリストを削除できるように、リスト(および含まれている要素)へのすべての参照を削除することです次の機会。これを行うには、たとえば、明示的に設定します
_Population = null;
_
これがあなたにとって十分でない場合、例えばあなたが本当にオブジェクトを取り除くことに熱心であるため nowand最適でない実行時の動作を受け入れることができ、オブジェクトの収集を開始するようにGCに指示できますnow経由
_GC.Collect();
_
このメソッドの詳細については、 こちら をご覧ください。
上記で示したように、この方法は、通常はそうしないプログラムのポイントでGCにリソースをクリーンアップさせるため、パフォーマンスの低下を引き起こす可能性があります。したがって、メソッドを直接呼び出すことは推奨されないことがよくありますが、これがアプリケーションの特別なポイントである場合は、ニーズを満たすことができます。実際の例として、初期化中に多くのオブジェクトを必要とするプログラムのピークメモリ使用量を改善しました。プログラムの実行が開始されました。ここでは、初期化後にGC.Collect()
を呼び出すことによるわずかなパフォーマンスの低下が正当化されました。
あなたができる最善のことは何もありません。ガベージコレクターGCは、このジョブを自動的に実行します。 ListはIDisposable
ではないため、破棄することはできません。
Clear
は単純にリストから要素を削除しますが、破棄しません。