<分区>
如果这个问题的答案很简单,我深表歉意。但我仍然无法自己弄清楚这一点。
.NET 中的垃圾收集器如何识别堆上的哪些对象是垃圾,哪些不是?
假设一个 .NET 应用程序正在运行,并且在某个时间点发生了垃圾收集(为了简单起见,我们省略了生成和终结队列)。
现在应用程序可能有:
- 堆栈变量指向堆上的对象。
- 包含堆上对象地址的寄存器。
- 指向堆上对象的静态变量。
这就是我假设 GC 的工作方式。
- 它取消引用每个这样的地址并最终到达堆上的对象。
- 它将对象标记为非垃圾(通过使用同步块(synchronized block)索引),因为一些变量仍然指向它。
- 它对所有地址(在大多数文章中出于某种原因称为根)执行此操作
- 现在,由于 .NET 运行时具有有关每个对象的类型的信息,它可以计算每个对象的大小,从而计算它占用的堆内存块。对于所有标记的对象,它保留占用的内存块。
- 剩余的内存被释放、压缩,如有必要,其他对象被重新定位(并更新它们的地址)。
我的理解正确吗?