Короткий ответ: следующие события запускают цикл сбора:
Распределение превышает порог Gen0
Сбор для определенного поколения происходит при достижении порога памяти для этого поколения. В реализации .NET версии 1.0 начальные пороговые значения для поколений 0, 1 и 2 составляют 256 килобайт (КБ), 2 мегабайта (МБ) и 10 МБ соответственно. Обратите внимание, что GC может регулировать эти пороговые значения динамически на основе шаблонов распределения приложения. Объекты размером более 85 КБ автоматически помещаются в кучу больших объектов.
System.GC.Collect()
называется
Распределения происходят только в Gen0. После каждого GC Gen0 пуст. Новые распределения заполнят Gen0, и произойдет следующий GC, и так далее. Проблема с вызовом GC.Collect () вручную состоит в том, что вы можете в конечном итоге вызывать его чаще, чем предсказывали (из-за того, что CLR также вызывает его), а производительность снижается, потому что вы запускаете циклы GC раньше их графика. .
Системе не хватает памяти
На это влияют другие процессы в системе, а это означает, что вы действительно не можете контролировать его, кроме обеспечения правильной очистки ресурсов в своих процессах и компонентах.