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