GC.Collect()
Хорошо, я прочитал несколько тем об этом, но здесь это идет. Давайте представим, что у меня есть приложение, в котором время от времени я нажимаю кнопку, в течение нескольких минут происходит много вещей, а затем оно остается бездействующим в течение еще одного часа или, может быть, только 1 минуты. Не после того, как все это закончилось хорошей ситуацией, чтобы позвонить в GC.Collect? Я имею в виду, я знаю, что именно в этот момент я не буду использовать свое приложение, и GC не может догадаться об этом.
7 ответов
Я вижу, что несколько человек были крайне недовольны тем, что не рекомендуют звонить в GC.Collect.
GC.Collect существует по причине, вот моя рекомендация о том, когда и зачем звонить в GC.Collect.
В общем, не беспокойтесь о его вызове, GC настроит себя очень хорошо и будет делать правильные вещи.
Иногда вы попадаете в ситуацию, когда вы точно знаете, что сейчас самое подходящее время для ее вызова, а описанная выше ситуация как раз подходит для ее вызова, фактически Asp.Net вызывает GC.Collect в определенные моменты, которые похоже на то, что вы описали.
GC хорошо подходит для вызова GC.Collect, если вы вызвали GC.Collect, GC может отменить ваше решение и все еще не собирать (вы должны установить флаг при вызове GC.Collect, чтобы выбрать это поведение), это рекомендуемый способ вызова GC.Collect, поскольку вы все еще позволяете GC решить, самое ли время для сбора.
Не принимайте мою рекомендацию - это общее утверждение для вызова GC.Collect, вы всегда должны избегать его вызова, если только вы ДЕЙСТВИТЕЛЬНО не уверены, что вам нужно его вызвать, ситуация, подобная той, которую вы описали, именно поэтому GC.Collect присутствует.
Выгода, которую вы получите от звонка, - это быстрое освобождение мусора, как правило, вы позаботитесь об этой ситуации, если
- Вы находитесь в ситуации с нехваткой памяти и хотите стремиться к сбору, если вы находитесь в ситуации с нехваткой памяти, ГХ все равно будет агрессивным и включится автоматически, если на машине слишком много памяти
- Если вы хотите избежать ситуации с нехваткой памяти и хотите собирать с нетерпением.
Надеюсь это поможет.
Спасибо
Почти всегда преждевременная оптимизация - беспокоиться о вызове GC.Collect до того, как вы создадите прототип или создадите приложение и протестируете его производительность. ГК обычно очень хорошо собирает память в подходящее время. Он, безусловно, будет запускать коллекцию во время простоя вашего приложения, особенно если в системе присутствует нехватка памяти.
Гораздо важнее, что вы будете следовать хорошим правилам распределения ГХ для поколений (небольшие объекты, короткое использование и т. Д.), И вы, вероятно, получите желаемые характеристики производительности. Если у вас все еще нет нужной производительности, после профилирования и хорошего дизайна вы можете подумать о GC.Collect как о решении.
Там почти никогда не бывает веских причин, чтобы позвонить GC.Collect()
,
В вашем случае нет абсолютно никаких причин называть это. Если вы простаиваете в течение часа, сборщик мусора выполнит сборы.
Я надеюсь, что вы знаете, что вызов GC.Collect не приводит к сбору большего (или меньшего) количества объектов.
Если вы пытаетесь оптимизировать время, знаете ли вы, сколько времени GC тратит на сбор объектов в вашем приложении? В настольных операционных системах (XP, Vista и т. Д.) CLR использует одновременный GC и может работать без приостановки всех потоков в приложении на время сбора.
Явный вызов GC.Collect не рекомендуется, потому что
Он выбрасывает алгоритм настройки CLR GC. Тюнер определяет, когда запускать GC автоматически, и принудительный ручной GC портит его вычисления.
Вынуждая коллекцию вручную, вы можете в конечном итоге продвигать объекты до поколения - объекты, которые могли быть собраны в следующем ГХ (если бы они были "осиротевшими" до того, как ГК решил вступить в строй).
Вам может показаться интересным, что.NET 4.0, механизм уведомления GC был введен для подобных сценариев.
Чтобы знать, когда позвонить GC.Collect()
вам необходимо знать подробности о конкретном сборщике, связанном со средой выполнения, а также подробную информацию о слабом месте, которое вы можете устранить с помощью коллекции.
Другими словами, если вы действительно знаете, когда вам нужно позвонить GC.Collect()
и это не то, что вы плохо сделали в другом коде, тогда вы, вероятно, работаете на внутренние компоненты CLR и можете просто решить проблему.
Да, как уже упоминалось в других публикациях, GC знает, когда начинать сбор лучше, чем вы, тот факт, что в вашем приложении не нажимаются кнопки, не означает, что пришло время начинать очистку, GC делает какие-то блокировки при перемещении объектов., так что это может привести к низкой производительности, если вы будете злоупотреблять GC.Collect
Обычно GC вызывается только если вы пытаетесь выделить новую память. Если вам не хватает памяти, вы получаете повышение производительности на 0% от вызова GC. Вы должны иметь довольно безумно ресурсоемкое приложение, чтобы даже приблизиться к пределам оперативной памяти на современных компьютерах.
Если ваша программа имеет много внешних ресурсов (таких как файлы или ссылки COM/DCOM), вы, возможно, захотите вызвать GC.
Если обращение в ГК даст вам душевное спокойствие, тогда продолжайте. Скорее всего, это не поможет, но, безусловно, не повредит.