<分区>
在 Joseph Albahari 的《C# 5.0 简而言之》一书中,我发现了这一点
它表示,只要您传递上次使用变量的代码行,它引用的对象就有资格进行垃圾回收(也就是说,如果没有其他变量持有对该对象的引用)。
但是根据this加州大学伯克利分校的讲座,只要对对象的引用存在于堆栈中,它就不会被垃圾回收。我的理解是,在方法返回之前,变量保留在堆栈中。这意味着它引用的任何对象在方法返回之前都是有效的。
这是书中的错误还是 java 和 .net 垃圾收集的工作方式不同?
<分区>
在 Joseph Albahari 的《C# 5.0 简而言之》一书中,我发现了这一点
它表示,只要您传递上次使用变量的代码行,它引用的对象就有资格进行垃圾回收(也就是说,如果没有其他变量持有对该对象的引用)。
但是根据this加州大学伯克利分校的讲座,只要对对象的引用存在于堆栈中,它就不会被垃圾回收。我的理解是,在方法返回之前,变量保留在堆栈中。这意味着它引用的任何对象在方法返回之前都是有效的。
这是书中的错误还是 java 和 .net 垃圾收集的工作方式不同?
最佳答案
However according to this lecture from UC Berkley, as long as a reference to the object exists on the stack, it won't be garbage collected.
你是对的。您缺少的是堆栈中不再存在引用。
对于在栈上构造对象的代码:
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
符合垃圾回收条件的原因:不再有任何对它的引用。
关于c# - 对象何时符合垃圾回收条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17497923/