web-dev-qa-db-ja.com

バックグラウンドと同時ガベージコレクションの違いは?

.NET Framework 4で、現在のガベージコレクションの実装が置き換えられていることを読みました。

.NET Framework 4は、バックグラウンドのガベージコレクションを提供します。この機能は、以前のバージョンの同時ガベージコレクションを置き換え、パフォーマンスを向上させます。

このページ でどのように機能するかについての説明がありますが、私はそれを理解したかどうかわかりません。

実際のアプリケーションでは、この新しいGC実装の​​利点は何ですか? 3.5以前から4.0への移行をプッシュするために使用できる機能ですか?

28
Drake

ここで、Microsoftは「concurrent」と「background」という名前を使用して、.NETで使用するGCの2つのバージョンを説明しています。 .NETの世界では、「バックグラウンドコレクター」は「並行コレクター」を拡張したものであり、コレクターの実行中にアプリケーションスレッドが実行できることに対する制限が少なくなります。

基本的なGCは、「ストップザワールド」戦略を使用します。アプリケーションスレッドは、共通のヒープからメモリブロックを割り当てます。 GCを実行する必要がある場合(たとえば、割り当てられているブロックが多すぎる場合は、クリーンアップが必要です)、all適用可能な(管理された)スレッドが停止します。最後に停止したスレッドはGCを実行し、終了すると他のすべてのスレッドのブロックを解除します。ストップザワールドGCは実装が簡単ですが、ユーザーレベルで認識できる一時停止を引き起こします。

Microsoftの「並行GC」は世代別です。ヒープの限られた部分(「世代0および1」と呼ばれるもの)に対してのみ、世界を停止する戦略を使用します。その部分は小さいままなので、一時停止は短いままで(たとえば、50ミリ秒未満)、ユーザーが気付かないようにします。ヒープの残りの部分は、専用のGCスレッドで収集されます。このスレッドは、適用可能なスレッド(名前の由来)と同時に同時に実行できます。

並行GCにはいくつかの制限があります。つまり、GCスレッドがヒープのある程度排他的な制御を引き受けなければならない瞬間があります。このような場合、適用可能なスレッドは、小さなスレッド固有の領域からのみブロックを割り当てることができます。より大きなニーズを持つスレッドは、すぐにメインヒープに遭遇します。メインヒープは、その時点でGCスレッドによってロックされています。次に、割り当てスレッドは、GCスレッドがヒープのロックフェーズを終了するまでブロックする必要があります。これは再び一時停止を引き起こします。ストップザワールドGCよりも一時停止が少なく、これらの一時停止がすべてのスレッドに影響するわけではありません。それにもかかわらず、一時停止します。

「バックグラウンドGC」は、GCスレッドがヒープをロックする必要がない拡張GCです。これにより、前の段落で説明した余分な一時停止が削除されます。若い世代が収集されるときのみ、限られた一時停止のままになります(Microsoftが「フォアグラウンドコレクション」と呼ぶもの)。

注:並行GCとバックグラウンドGCには「隠れたコスト」があります。これらのGCが正しく動作するには、アプリケーションスレッドからのメモリアクセスをいくつかの非常に特殊な方法で実行する必要があります。これは、パフォーマンスにわずかな影響を及ぼします。また、GCスレッドはキャッシュメモリに悪影響を及ぼし、間接的にパフォーマンスを低下させる可能性があります。ユーザーの操作を必要としない純粋な計算タスクの場合、世界を停止するコレクターは、平均して平均して、いくらか優れたパフォーマンス(たとえば、20 -時間の計算は19時間で完了します)。ただし、これはEdgeの場合であり、ほとんどの場合、並行GCとバックグラウンドGCの方が優れています。

80
Thomas Pornin

これは、自己重要性の鈍感や過度の膨らみのない現実世界の説明です。

並行GCでは、GC内での割り当てが許可されていましたが、not GC内で別のGCを開始することは許可されています。つまり、GCでの割り当てが許可される最大値は、スペースの上限です1つのセグメントに残っている(現在ワークステーションモードでは16 MB)から、すでに割り当てられているスペースを差し引いたもの)。

バックグラウンドモードの違いは、フルバックグラウンドGCで許可新しいGC(gen 0 + 1)を開始できることです。これにより、新しいセグメントを作成することもできます必要に応じて割り当てます。つまり、1つのセグメントにすべてを割り当てたときに発生する可能性があったブロッキングは、発生しなくなります。

テスダマンから! http://blogs.msdn.com/b/tess/archive/2009/05/29/background-garbage-collection-in-clr-4-0.aspx

8
Boppity Bop

主な利点は、ガベージコレクションによるアプリケーションのフリーズが少なくなることです。これ自体が大幅な改善と見なされる可能性があります。ほとんどのアプリでは、メモリ内に膨大な数の長寿命のオブジェクトがない限り、この違いは目立ちません。

この変更により、.NETは、タイミングに敏感なアプリ(応答時間が重要な場合)を構築するために少し実行可能になります。極端な例は車のエアバッグです。膨らませる必要があるときにソフトウェアがガベージコレクションを行うのに忙しくしたくないでしょう。 4.0での変更により、GCによるフリーズの数と長さが減少しますが、完全に削除されるわけではありません。

1
Morten Mertner