Lin*_*enk 4 c# garbage-collection
在c#中,当没有对象的引用时,对象会被垃圾回收.假设是这种情况,是否会收集以下任何一个,或者垃圾收集器是否足够智能以丢弃它们?
class Program
{
static void Main()
{
A a = new A();
a.b = new B();
a.b.a = a;
a = null;
}
{
class A
{
public B b;
}
class B
{
public A a;
}
Run Code Online (Sandbox Code Playgroud)
一旦不再需要它们,它们都将有资格收集.这意味着在某些情况下,甚至可以在定义对象的范围结束之前收集对象.另一方面,实际的收集可能也会发生得更晚.
.NET垃圾收集器不基于引用计数,因此循环依赖没有区别.
它基于标记和扫描算法,它将所有对象视为集合的候选对象,然后从可用的根(局部变量,静态变量)遍历对象图,将它们标记为仍然"活着".那些没有被标记为仍在使用中的,被收集.请注意这是一个简单的描述:.NET中的真实算法是自适应标记和扫描,托管堆分为3代+大对象堆,完全忽略完成等等.
我建议查看Maoni Stephens的博客了解更多信息.
| 归档时间: |
|
| 查看次数: |
234 次 |
| 最近记录: |