ただし、カリフォルニア大学バークレー校のこの講義によると、オブジェクトへの参照がスタック上に存在する限り、ガベージ コレクションは行われません。
あなたが正しい。あなたが見逃しているのは、参照がスタックに存在しなくなったことです。
スタック上にオブジェクトを構築するコードの場合:
StringBuilder ref1 = new StringBuilder("object1");
変数ref1
は、スタックのメモリ位置に格納されます。
0x403730:
Stack Pointer -> 0x40372C: pointer to ref1
0x403728: saved value of EBP
0x403724: saved value of return address
0x403720
次の行が来ます:
StringBuilder ref2 = new StringBuilder("object2");
ポインタはどこref2
に保存されますか? スタック上: はい。しかし、スタックのどこに?もちろん、使用されていたのと同じメモリ位置でref1
!:
0x403730:
Stack Pointer -> 0x40372C: pointer to ref2
0x403728: saved value of EBP
0x403724: saved value of return address
0x403720
別の値を単にスタックにプッシュするのはばかげています。
Stack Pointer -> 0x403730: pointer to ref2
0x40372C: pointer to ref1
0x403728: saved value of EBP
0x403724: saved value of return address
0x403720
ref1
もう必要ないので、それはばかげているでしょう。
がガベージ コレクションの対象となるのはそのためref1
です。これに対する参照はもうありません。