2011-10-27 7 views
5

Gen 0: Gen 0がサイズのしきい値を超えると、gen 0トリガーが読み込まれます。しかし、私は、「新しい」は単にアドレスを前方にスライドさせるだけなので、GCは「新しい」で実行されないことも読んでいます。次に、gen 0 GCをトリガするしきい値を超えたことをいつチェックしますか?gen 0、gen 1、gen 2はいつトリガされますか?

Gen 1/2: DoG 1/2にGCをトリガーする独自のサイズのしきい値がありますか?彼らはいつ閾値を検討するのですか?生存者が世代に昇進した瞬間ですか?

gen 1 GCが最初にgen 0をチェックしてからgen 1に昇格し、gen 1がしきい値を超えてgen 1をチェックし、gen 0を再度チェックすることを意味しますか?

これはgen 2 GCが最初にgen 0をチェックしてgen 1に昇格し、gen 1がしきい値を超えてgen 1をチェックし、gen 0を再度チェックすることを意味します。次にgen 0がgen 1とgen 1 to gen 2に昇格し、gen 2がしきい値を超えていることを確認し、gen 2、gen 1、gen 0を再度確認します。

+4

これらの詳細はすべて、独自の内部実装の詳細であり、実装ごとに異なり、いつでも変更される可能性があります。また、GCは独自のスレッドで実行されるため、スレッドのスケジューリングも重要です。あなたが気にする理由を言うことができれば、それはあなたに良い答えを得るのに役立ちます。たとえば、悪い時に高価な収集が発生する危険性があるときを知りたいので気にするなら、GCの内部の詳細を知らない*ことがわかる方法があります。 –

+0

私はGCを完全に知らない人に説明しなければならないので気になります。私は単にその効果を知っているが、私は原因を知らないことがわかりました。実装の詳細ではなく、説明する必要のないものもわかりません。 –

+1

GCが起動したときに気になる人は、間違っています。 – leppie

答えて

0

VMがメモリ不足のときにGen 0がトリガーします。
Gen 1が十分なメモリを解放せず、メモリがまだ不足しているときに、Gen 1がトリガします。
Gen n - 1が十分なメモリを解放せず、メモリがまだ不足している場合、Gen nがトリガします。
最後のGenに達しても、十分なメモリが解放されなかった場合、新しいメモリが割り当てられます。

+0

Gen 2 GCが発生するにはGen 0を最初にチェックし、Gen 1に昇格させ、Gen 1がしきい値を超えてGen 1をチェックし、Gen 0を再度チェックすることは真実ですか?次にgen 0がgen 1とgen 1 to gen 2に昇格し、gen 2がしきい値を超えていることを確認し、gen 2、gen 1、gen 0を再度確認します。 –

+0

メモリがすでに正常で、コレクションが成功したかどうかにかかわらず、すべてがプロモートされます。 gen 1に行き、コレクションが成功しないと、gen2に戻ります。 – Dani

1

CLRが初期化された後、マネージヒープに最初に追加されたオブジェクトはGen0として定義されます。 GCを実行すると、収集されなかったオブジェクトの生成が1レベル増加し、Gen1になります。それ以降に作成されるオブジェクトはまだGen0です。オブジェクトが作成されると、Gen0オブジェクトによって解放されたメモリが新しいオブジェクトを作成するのに十分でなく、Gen1のボリュームが容量を超えた場合のみ、GCはGen0オブジェクトとGen1オブジェクトの両方を収集します。その後、Gen1で収集されなかったオブジェクトはGen2になり、Gen0で収集されなかったオブジェクトはGen1になります。それ以降に作成されるオブジェクトはまだGen0です。

関連する問題