2011-03-10 11 views
2

バックグラウンド:オブジェクトをデキューすると、Queueオブジェクトから参照が削除され、GCが許可されますか?

.NETフレームワークで利用できるさまざまなコレクションオブジェクトを見て、どちらを使用するかを決定しようとしています。

私はコレクション内の各オブジェクトを必ず通過しなければならず、それらを列挙して処理して削除する必要はありません。私はこれをメモリ内で行う必要があり、データセットは大きくなる(ギグで閉じる)。私はできるだけ早く減らすために私のメモリフットプリントが必要です。

質問:キューコレクションのオブジェクトをデキューすると、キュー内のその参照が解放され、ガベージコレクタはそのジョブを実行できますか?あなたが話をしている場合は

+0

うまくいけば、それはそうでなければ、かなり深刻なメモリリーク:) – dSebastien

答えて

5

(デキューオブジェクトへの他の参照を想定していない)を内蔵したオブジェクトが、その後デキューされ、その後Queue<T>Queueコレクションはい、以前にそのオブジェクトを開催補助配列内の要素default(T)/nullに設定されているため、オブジェクトを後で収集することができます。

+1

補遺を持っていると思い、ガベージコレクションのオブジェクトの資格を作成する必要があります。これは、* *現在、上書きしないでメモリリーク 'ConcurrentQueue '、のためのケースではありません素子。 – porges

1

舞台裏では、Queueクラスは、内部の円形配列と、円形配列の先頭と末尾のマーカーとして機能する2つの変数、つまり頭と尾を維持します。

Enqueue()メソッドは、新しい項目をキューに追加するのに十分な容量があるかどうかを判断することから開始します。そうであれば、要素をテールインデックスで円形配列に追加し、モジュラス演算子を使用してテールを "インクリメント"して、テールが内部配列の長さを超えないようにします。しかし、十分なスペースがない場合、アレイは指定された成長因子だけ増加する。この成長因子のデフォルト値は2.0であるため、内部配列のサイズは2倍になりますが、オプションでQueueクラスのコンストラクタでこの係数を指定できます。

The `Dequeue()` method returns the current element from the head index. 
It also sets the head index element to null and "increments" head. 

Soは「デキュー」オブジェクトは、非決定論的であるが ヌル以降、必要に応じてGCed上に設定されています。 GCの実行時間はさまざまです。

0

これらのオブジェクトへの追加参照がないと仮定すると、それらを削除するとGCにマークされますが、コレクションが実際に行われるときは保証されません。追加の参照がある場合、それらの参照が解放されるまでオブジェクトはメモリに保持されます。

関連する問題