Меня беспокоит сборка мусора в случае, когда два объекта ссылаются друг на друга ...
public class A
{ public readonly B _b;
public A()
{ _b = new B(this);
}
}
public class B
{ public readonly A _a;
public B(A objA)
{ _a = objA;
}
}
В этом случае третий класс может ссылаться на A
...
public class Foo
{ public A _a = new A(); // A and B are both created here.
public void Bar()
{ _a = new A();
} // Create a new A (and B)
}
Обычно сборщик мусора располагает объектами, которые больше не имеют активных ссылок.Но в этом случае объекты A и B никогда не теряют все свои активные ссылки, поскольку они всегда ссылаются друг на друга.
Когда объект Foo
заменяет текущий A
(и B
) нановый A
(и B
), сможет ли сборщик мусора очистить старый A
(и B
) без запуска бесконечного цикла с круговыми ссылками на объекты?
Thisэто серьезная проблема, потому что это приложение ASP.NET.Эти объекты будут создаваться несколько раз за веб-запрос и могут задерживаться до перезапуска сервера, если сборщик мусора не может их очистить.
Возможные отрицательные результаты:
<< Сбой веб-сервера из-за переполнения ОЗУ. <br><< Сбой веб-сервера из-за бесконечного цикла сбора мусора. </p>
Как .NET обрабатывает сборку мусора в сценарии такого типа?