Если у меня есть цикл, такие как это:Вывоз мусора из труднодоступных объектов в цикле
public class Foo {
public Foo Foo;
public Foo() {
}
}
class Program {
public static void Main(string[] args) {
var foo = new Foo();
long i = 0;
while(i < Int64.MaxValue) {
foo.Foo = new Foo();
foo = foo.Foo;
if(i % 10000 == 0)
GC.Collect();
i++;
}
GC.Collect();
}
}
сборщик мусора не будет убирать родительские объекты до тех пор, пока цикл завершается. Почему это? Я не вижу никакого способа ссылаться на них из кода, как только foo
переназначается, поэтому их не следует очищать?
Я изучал использование памяти в диспетчере задач после передачи некоторых точек останова, которые я установил, чтобы определить, что это происходит. Он продолжает расти внутри цикла (до нескольких ГБ, если я делаю это бесконечным), но сразу бросается, когда цикл завершается, и вызывается второй вызов GC.Collect().
Какие "родительские объекты"? –
«Сборщик мусора не будет очищать родительские объекты до тех пор, пока цикл не будет завершен»: можете ли вы описать в своем вопросе, как вы делаете эти наблюдения? – quantdev
@quantdev Я редактировал вопрос. – joelises