web-dev-qa-db-ja.com

C#の大きなリストで使用される空きメモリの量

Populationというリストがあります。これは非常に多くのポジションの素晴らしいリストであり、ある時点で使用をやめます。リソースを解放するにはどうすればよいですか?次に、これはコードの一部です。

 private List <BasePopulation> Population=new List <BasePopulation>();
 Population.SomeMethod();
 Population.Clear();

Clearメソッドを使用しましたが、動作しません。何か案が?

25
Esneyder

問題は、Clearが思っているとおりに動作していないことです。 Clearは、バックグラウンドで使用する内部配列のサイズを変更せずに、単にListを空としてマークします。ただし、個々のBasePopulationインスタンスへの参照はすべて削除されます。したがって、他のデータ構造にそれらへの参照がない場合、それらはガベージコレクションの対象となります。しかし、notListのサイズを直接縮小します。 ILSpyを使用してこれを確認しました。

2つのオプションがあります。

  1. セットする Population = null。これにより、オブジェクトインスタンス全体のルートが解除され、ガベージコレクションの対象になります。

  2. このTrimExcessListを呼び出します。これにより、内部配列のサイズが変更されます。

31
Brian Gideon

ガベージコレクター(GC)がメモリ管理を処理しているため、最初にできることは、GCがリストを削除できるように、リスト(および含まれている要素)へのすべての参照を削除することです次の機会。これを行うには、たとえば、明示的に設定します

_Population = null;
_

これがあなたにとって十分でない場合、例えばあなたが本当にオブジェクトを取り除くことに熱心であるため nowand最適でない実行時の動作を受け入れることができ、オブジェクトの収集を開始するようにGCに指示できますnow経由

_GC.Collect();
_

このメソッドの詳細については、 こちら をご覧ください。

上記で示したように、この方法は、通常はそうしないプログラムのポイントでGCにリソースをクリーンアップさせるため、パフォーマンスの低下を引き起こす可能性があります。したがって、メソッドを直接呼び出すことは推奨されないことがよくありますが、これがアプリケーションの特別なポイントである場合は、ニーズを満たすことができます。実際の例として、初期化中に多くのオブジェクトを必要とするプログラムのピークメモリ使用量を改善しました。プログラムの実行が開始されました。ここでは、初期化後にGC.Collect()を呼び出すことによるわずかなパフォーマンスの低下が正当化されました。

8
bigge

あなたができる最善のことは何もありません。ガベージコレクターGCは、このジョブを自動的に実行します。 ListはIDisposableではないため、破棄することはできません。

Clearは単純にリストから要素を削除しますが、破棄しません。

2
Krishna