这个问题在这里已经有了答案:
Understanding garbage collection in .NET
(2 个回答)
6年前关闭。
如果这个问题的答案是微不足道的,我很抱歉。但我自己仍然无法弄清楚这一点。
.NET 中的垃圾收集器如何识别堆上的哪些对象是垃圾,哪些对象不是?
假设一个 .NET 应用程序正在运行,并且在某个时间点发生垃圾收集(为了简单起见,让我们忽略生成和完成队列)。
现在应用程序可能有:
这就是我假设 GC 的工作方式。
我的理解正确吗?
最佳答案
在某些情况下你是对的。 GC 悲观地查看堆 - 即它开始假设所有内容(在第 0 代中)都将被 GC。
它实际上通过称为“标记”的第一次扫描遍历堆上的所有内容,其中检查是否有任何东西引用它。由于它们都是引用类型,而一些引用其他类型,它将递归地导航引用。别担心 - 有逻辑不进入无限循环!
如果它发现一个对象没有被引用,它会首先通过在对象内设置一个称为同步块(synchronized block)索引的标志来标记它。
在遍历堆上的每个对象之后,它将开始一个称为“压缩”的过程,即当它将所有剩余的对象转移到同一内存区域中时,上面的内存是空的。它将同一代的对象保持在一起,因为它们在统计上更有可能同时被取消引用。
因此,这将减少所需的内存。
垃圾收集不一定会加速您的程序,但确实允许它重新使用未使用对象占用的空间。
关于这个主题有很多很多文章。我个人喜欢 Jeffrey Richter 的“CLR via C#”,他给出了一个关于它如何工作的精彩章节。
关于.NET 垃圾收集器基础知识,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1090451/