Задать вопрос
ImmortalCAT
@ImmortalCAT
C# loving

Когда используете принудительную сборку мусора?

Когда необходимо принудительно юзать
GC.Collect();
В каких ситуациях/случаях или по какой логике необходимо использовать сборку мусора?
Или сборка мусора необходима только после обработки большого объема данных (Например обработка полигона по пиксельно с float'ами и тд)?
  • Вопрос задан
  • 234 просмотра
Подписаться 2 Простой Комментировать
Решения вопроса 3
mindtester
@mindtester Куратор тега C#
http://iczin.su/hexagram_48
это из серии - не заморачивайтесь, пока реально не упретесь в проблемы, с паузами на сборку мусора

тогда сама проблема и будет ответом на ваш вопрос

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

(!) не следует путать с обязательным освобождением системных ресурсов - это обычно всегда отмечается в примерах MSDN - некий системный ресурс (типа кисть при рисовании в формах) должен быть обязательно освобожден. это не связано со сборщиком мусора, а связано с тем, что сборщик мусора не управляет системными объектами вообще
Ответ написан
VoidVolker
@VoidVolker Куратор тега C#
Dark side eye. А у нас печеньки! А у вас?
Когда сборщик мусора не способен самостоятельно произвести сборку мусора в нужный момент времени или в определенных условиях.
Ответ написан
@basrach
Вызов GC.Collect() нужен для сборки объектов в 1 и во 2 поколениях. То что в 0 поколении и так прекрасно собирается. Но то что переживает 0-вое поколение, т.е. объекты в 1-ом и во 2-ом поколениях, очень редко удостаиваются внимания сборщика, если нет жесткого прессинга по памяти. При этом, очень большие объекты, в том числе массивы, при создании помещаются сразу в кучу во 2-ое поколение.
Соответственно, нужно чтобы совпало:
1) В программе есть некоторая операция, которая создает очень большой объект, такой, что он сразу попадает во 2-ое поколение.
2) Свободной памяти на сервере больше нет, либо очень мало.
3) Нужно избежать простоя, связанного со сборкой мусора, при запуске следующей подобной операции.
4) В некоторой точке программы точно можно гарантировать, что нет ни одной ссылки на тот большой объект (иначе GC его не удалит)
И только тогда можно дернуть GC.Collect(). Иначе смысла вызывать его нет.
Т.е. вы на сто процентов уверены, что будет задержка вызванная сборкой мусора, и именно тем, что сборщик полезет чистить 1-ое и 2-ое поколение, но вас не устраивает то, когда именно произойдет эта задержка, и вы переносите её на более ранее время (возможно более подходящее/приемлемое) принудительным вызовом GC.Collect().
Главное нужно понимать, что GC.Collect() волшебным образом не очистит память. Чтобы этот вызов что-то почистил нужно быть на 100% уверены, что в памяти есть объекты на которые нет ссылок, но которые застряли в памяти. Иными словами, что нет утечек памяти. (да да, программы на дот.нет тоже могут течь) Как правило, если устранить утечки, т.е. выстроить правильную работу с памятью, то потребность принудительно указывать сборщику мусора отпадет сама собой.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
AlexanderYudakov
@AlexanderYudakov
C#, 1С, Android, TypeScript
На моей памяти было два случая:

1. При использовании memory-profiler. Чтобы посмотреть, что там в памяти осталось.

2. Для того, чтобы почистить кэш объектов, хранящихся во WeakReference. Чтобы получить список живых объектов.
Ответ написан
Комментировать
@BashkaMen
C# программист
Ну в основном в методах Dispose (реализация IDisposable)
https://msdn.microsoft.com/ru-ru/library/system.id...

Возможно в деструкторах ещё, но они считаются плохой практикой в C#
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы