3

値型であると宣言するint a = 0;と、スタックからメモリを取得するので、この変数がスコープ外になると、ガベージコレクターはこのメモリを再利用しますか?

4

1 に答える 1

16

int a = 0; を宣言すると、値型であるため、スタックからメモリを取得します

ローカル変数が短命であると仮定すると、それは正しいですが、ロジックは間違っています。短命のローカルを宣言すると、短期メモリプールからメモリが取得されます。これはスタックである場合もあれば、レジスタである場合もあります。値型であるか、参照型のオブジェクトへの参照であるかに関係なく、短期プールからメモリを取得します。どちらの方法でも、変数の有効期間が短い場合、メモリは短期プールに割り当てられます。

つまり、短命のローカルがある場合

object x = null;

オブジェクトへの参照用のストレージは短期プールに割り当てられます。参照先オブジェクトのストレージがある場合は、長期プールであるヒープに割り当てられます。この場合、参照は null です。

この変数が範囲外になると、ガベージ コレクターはこのメモリを再利用しますか?

いいえ。ガベージ コレクターは、ヒープとも呼ばれる長期プールに割り当てられたメモリのみを収集します。

もちろん、ガベージ コレクターは短期間のプールについて認識している必要があります。短期プールに参照がある場合、それらの参照は生きているものに対するものである可能性があります。ただし、ガベージ コレクターは、短期プールにある参照を含まないすべての値の型を安全に無視できます。

なぜあなたは質問をしているのですか?ここには、隠されたより深い問題があるのではないかと思います。

于 2012-04-05T13:53:41.697 に答える