は、私は、次のコードを持っている:それはRunning
状態にある間新しいスレッド()およびガベージコレクション
new Thread(new ThreadStart(delegate()
{
while (true)
{
//something
}
})).Start();
ガベージコレクタはThread
のこのインスタンスを確定することはできますか?
は、私は、次のコードを持っている:それはRunning
状態にある間新しいスレッド()およびガベージコレクション
new Thread(new ThreadStart(delegate()
{
while (true)
{
//something
}
})).Start();
ガベージコレクタはThread
のこのインスタンスを確定することはできますか?
CLRは実行中のすべてのスレッドを追跡します。オブジェクトへの参照がある限り、ガベージコレクションは行われません。また、CLRは実行中のすべてのスレッドへの参照を保持しているので、GCはそれらに触れません。
いいえ;実行スレッドは根としてカウントされます。実行中のスレッドは収集されず、そのスレッドのスタックのアクティブなパーツによって参照されるものもありません。
実行中のスレッド、待機中のスレッド、または中断されたスレッドが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();
これは何かをする実行の別のスレッドを起こしたコードの別の部分です。この場合、タイマーは、実行前、実行中、またはコンストラクターが復帰した後はいつでもガベージコレクトすることができます。
ここで重要なことは、タイマーのための個別のスレッドがなく、スレッドはタイマーオブジェクトについても「認識」していないことです。オブジェクトの最後のアクセスはその後起こったので、コレクションの対象となります。これは、実行中(または待機中など)の個々のスレッドの問題とは異なります。
_実行中のスレッドは、ルートとしてカウントされますか?_または_references(スレッド内で)オブジェクトを参照するものは、ルートとしてカウントされます。 –
@Royiのルーツ - 基本的にスタックのローカルです。 arg0(別名これ)は、通常、ターゲットインスタンスを生き残らせることにも注意してください。 –
これは間違っていますか?OKです:_GCは実行中のスレッドを収集することはできません? –