Страницы

Поиск по вопросам

воскресенье, 29 декабря 2019 г.

Когда ручной вызов GC.Collect() оправдан?

#c_sharp #net #сборщик_мусора


Часто нахожу в коде вызовы GC.Collect(), например при работе с графиков через GDI+.

В умных книжках пишут, что его никогда не нужно вызывать самому.

Собственно вопрос, а есть ли оправданные случаи, когда его нужно вызывать или это
признак плохого когда?
    


Ответы

Ответ 1



Обычно не нужно. Иногда имеет смысл это делать: После уничтожения большого количества объектов (например, закрытия формы с большим количеством элементов) Когда приложение имеет четко выраженные периоды активности и простоя. Если принудительно вызвать сборку мусора в период простоя, уменьшится вероятность того, что она произойдет в период активности и затормозит выполнение кода. Ссылки: When to call GC.Collect() When is it acceptable to call GC.Collect?

Ответ 2



Просто так, без веских причин, и без точного понимания, что происходит при сборке мусора, дергать GC.Collect не стоит. Рантайм сам вполне справляется с автоматической сборкой мусора. Не стоит дергать Collect ни по таймеру, ни "на всякий случай" - это не даст никакого реального "ускорения" или улучшения. Более-менее реальные причины для вызова Collect: Вы точно знаете что в вашем приложении только что стало мусором огромное количество объектов И при этом мгновенно сократить потребление памяти приложением достаточно критично. Если мгновенность не требуется (а она не требуется почти никогда) - хватит автосборки. В рамках теста, который меряет потребление памяти. В рамках теста, который проверяет работу кода с WeakReference. При входе / выходе из режима GCLatencyMode.LowLatency и GCLatencyMode.SustainedLowLatency - стоит вызвать GC.Collect(2, GCCollectionMode.Forced) (возможно) при выходе из региона GC.TryStartNoGCRegion / GC.EndNoGCRegion. Топик на enSO: When is it acceptable to call GC.Collect?

Комментариев нет:

Отправить комментарий