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