然而,根据加州大学伯克利分校的讲座,只要堆栈上存在对该对象的引用,就不会被垃圾回收。
你是对的。您缺少的是堆栈中不再存在引用。
对于在堆栈上构造对象的代码:
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
有资格进行垃圾收集:不再有任何对它的引用。