4

ルートを nullにするメソッドclear()を使用して c# に実装されたバイナリ ツリーがあるため、ヒープ内のルート ノードへの参照が削除されます。これにより、ヒープ内のルート ノードがガベージ コレクションの対象になります。

しかし、ガベージ コレクション サイクル中はルート ノードのみが収集され、その 2 つの子ノードが次のサイクルでガベージ コレクションの対象となり、ツリーを削除するためにツリーの深さと同じ数のサイクルが必要になるか、ツリー全体がヒープは1サイクルで収集されますか?

4

2 に答える 2

3

GC は到達できないすべてのオブジェクトを 1 サイクルで検出するため、ツリー全体が収集されます。ツリー内のどのノードにも (ライブ ルートから) 到達できないため、ノード セット全体を GC する必要があります。

これは GC が機能する効率的な方法ですが、二重リンク リストなどの自己参照データ構造を処理するのにも適しています (これは、"到達可能性を取得しないアルゴリズムでは問題を引き起こす可能性があります)。いくつかの到達可能なルート」を考慮に入れます)。

于 2013-02-11T08:34:45.870 に答える
2

実際には、オブジェクトが生きている期間によって異なります。

.NET は、ここで説明されている「マーク & スイープ」という名前のアルゴリズムを使用します。このアルゴリズムは基本的に、到達可能なものを除いて、すべてを削除するようにマークします。オブジェクトはここで 1 回の繰り返しで削除されます。

ただし、ほとんどの「寿命の長い」オブジェクトは GC を生き残るため、単純なマーク & スイープには多くの時間がかかります。有効期間の長いオブジェクトがあるほど、GC がすべてのオブジェクトをマークするのに必要な時間が長くなります。これが、オブジェクトが生き残った GC サイクルの数を .NET が追跡する理由です。数回生き残った場合、次の GC はオブジェクトをスキップします。これらは「世代」と呼ばれ、MSDNで説明されています。簡単に言えば、オブジェクトが GC サイクルを生き延びた回数が多いほど、ガベージ コレクターが削除のためにアクセスする頻度が低くなります。

ただし、ある時点で構造体が GC によって「参照されていない」とマークされると、構造体全体が 1 回のパスで削除されます。

于 2013-02-11T08:46:54.920 に答える