c# - 对象何时符合垃圾回收条件?

标签 c# garbage-collection

<分区>

在 Joseph Albahari 的《C# 5.0 简而言之》一书中,我发现了这一点

enter image description here 它表示,只要您传递上次使用变量的代码行,它引用的对象就有资格进行垃圾回收(也就是说,如果没有其他变量持有对该对象的引用)。

但是根据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/

相关文章:

c# - Javascript/.NET 正则表达式

perl - 如何禁用 perl 的垃圾收集器?

java - 不朽之物真的存在吗?

c# - 如何使用 Dapper 在客户端获取原始 SQL 错误消息?

garbage-collection - UIView 事件和垃圾收集

java - 什么是堆中的并发标记-清除生成?

java - 如果一个对象只有一个实例变量可访问,垃圾收集器会做什么

c# - 为什么在 C# 中,在默认情况下切换循环中需要 break?

c# - JSON.NET DataContractJsonSerializer 和 Newtonsoft JSON 序列化程序有什么区别

c# - 这个 SQL 查询如何在 Oracle SQL Developer 中运行而不是在代码中运行?