Что влияет на сроки проведения ГХ? - PullRequest
2 голосов
/ 24 апреля 2010

Я знаю, что невозможно узнать, когда происходит GC, но есть факторы, которые скажут вам, как часто / когда это может происходить. Какие это факторы? Во-первых, сколько объектов создано и т. Д.

Ответы [ 3 ]

4 голосов
/ 24 апреля 2010

Короткий ответ: следующие события запускают цикл сбора:

Распределение превышает порог Gen0

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

System.GC.Collect() называется

Распределения происходят только в Gen0. После каждого GC Gen0 пуст. Новые распределения заполнят Gen0, и произойдет следующий GC, и так далее. Проблема с вызовом GC.Collect () вручную состоит в том, что вы можете в конечном итоге вызывать его чаще, чем предсказывали (из-за того, что CLR также вызывает его), а производительность снижается, потому что вы запускаете циклы GC раньше их графика. .

Системе не хватает памяти

На это влияют другие процессы в системе, а это означает, что вы действительно не можете контролировать его, кроме обеспечения правильной очистки ресурсов в своих процессах и компонентах.

1 голос
/ 24 апреля 2010

Сборка мусора происходит, когда выполняется одно из следующих условий:

В системе недостаточно физической памяти.

Память, используемая выделенными объектами в управляемой куче, превышает допустимый порог. Это означает, что в управляемой куче превышен порог допустимого использования памяти. Этот порог постоянно регулируется в процессе работы.

Вызывается метод GC.Collect. Почти во всех случаях вам не нужно вызывать этот метод, потому что сборщик мусора работает непрерывно. Этот метод в основном используется для уникальных ситуаций и тестирования.

0 голосов
/ 24 апреля 2010

Для настольной версии C # есть несколько факторов:

  • Объем выделенной памяти (каждый раз, когда выделяется 1 МБ, запускается уровень 1 ГХ)
  • Давление в системной памяти (если объем физической памяти становится низким, GC может быть запущен)
  • Виртуальная память фиксирует (если система хочет зафиксировать страницы памяти, GC может быть запущен до операции)
  • Программный запуск из кода.
  • Другие эвристики могут использоваться GC для запуска коллекций.

В случае, если вас интересует, когда собрания уровня 3 должны произойти в .Net Framework 3.0 и выше, существуют уведомления GC, на которые вы можете подписаться, чтобы получать уведомления до того, как они произойдут: RegisterForFullGCNotification

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...