2012-01-25 10 views

答えて

21

CLRは実行中のすべてのスレッドを追跡します。オブジェクトへの参照がある限り、ガベージコレクションは行われません。また、CLRは実行中のすべてのスレッドへの参照を保持しているので、GCはそれらに触れません。

13

いいえ;実行スレッドは根としてカウントされます。実行中のスレッドは収集されず、そのスレッドのスタックのアクティブなパーツによって参照されるものもありません。

+0

_実行中のスレッドは、ルートとしてカウントされますか?_または_references(スレッド内で)オブジェクトを参照するものは、ルートとしてカウントされます。 –

+0

@Royiのルーツ - 基本的にスタックのローカルです。 arg0(別名これ)は、通常、ターゲットインスタンスを生き残らせることにも注意してください。 –

+0

これは間違っていますか?OKです:_GCは実行中のスレッドを収集することはできません? –

2

実行中のスレッド、待機中のスレッド、または中断されたスレッドがGCによって使用され、スレッドのスタック内のすべてをトレースします。それらによって参照されるなど、あなたはガベージコレクションできないすべてのものを特定しました)。

バックグラウンドスレッドの場合、スレッドは終了する可能性があります。これは、プロセス内の他のスレッドがすべて終了すると、スレッドがシャットダウンするためです。さもなければ、それを死に至らしめる唯一のものは、プロセスが積極的に出て行くことです。例外(ThreadAbortExceptionを含む)またはそれはループ自体のwhileから抜け出します。

あなたが何を考えているのかもしれいくつかの方法で、比較可能だケースがあります:

var timer = new System.Threading.Timer(someCallback, null, new TimeSpan(0, 0, 5), new TimeSpan(0, 0, 5)); 
int someResult = doingSomethingElse(); 
doSomethingElseThatTakesLongerThan5Seconds(); 

これは何かをする実行の別のスレッドを起こしたコードの別の部分です。この場合、タイマーは、実行前、実行中、またはコンストラクターが復帰した後はいつでもガベージコレクトすることができます。

ここで重要なことは、タイマーのための個別のスレッドがなく、スレッドはタイマーオブジェクトについても「認識」していないことです。オブジェクトの最後のアクセスはその後起こったので、コレクションの対象となります。これは、実行中(または待機中など)の個々のスレッドの問題とは異なります。

関連する問題