Подтвердить что ты не робот

GC.Collect()

Хорошо, я прочитал пару тем об этом, но здесь все идет. Представьте себе, что у меня есть приложение, в котором я каждый раз нажимаю на кнопку, много чего произойдет в течение пары минут, а затем он будет оставаться без дела в течение еще одного часа или, может быть, всего лишь 1 минута. Не только после того, как все это закончится хорошей ситуацией, чтобы назвать GC.Collect? Я имею в виду, я знаю, что в тот момент я не буду использовать свое приложение, и GC не может догадаться.

4b9b3361

Ответ 1

Я вижу, что несколько человек перестали рекомендовать звонить GC.Collect.

GC.Collect существует по какой-то причине, вот моя рекомендация о том, когда и почему вызывать GC.Collect.

  • В целом, не беспокойтесь о его вызове, GC очень хорошо себя зарекомендовал и будет поступать правильно.

  • Иногда вы оказываетесь в ситуации, когда вы точно знаете, что это подходящее время для ее вызова, ситуация, о которой вы описали выше, - это именно то подходящее время для ее вызова, ведь Asp.Net вызывает GC. Соберите в определенных точках, которые похожи на то, что вы описали.

  • GC умеет вызывать GC.Collect, если вы вызвали GC.Collect, GC может переопределить ваше решение и все еще не собирать (вам нужно установить флаг, когда вы вызываете GC.Collect, чтобы выбрать это поведение), это рекомендуемый способ вызова GC.Collect, так как вы все еще позволяете GC решает, хорошо ли собирать время.

  • Не принимайте мою рекомендацию - это общий оператор для вызова GC.Collect, вы всегда должны избегать его вызова, если только вы НЕ ДОЛЖНЫ быть уверены, что вам нужно его называть, ситуация, подобная той, которую вы описали, является именно тем, почему GC. Собирать есть.

  • Преимущество, которое вы получите от его вызова, быстро освобождает мусор, обычно вы будете заботиться об этой ситуации, если

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

Надеюсь, что это поможет. Благодаря

Ответ 2

Почти всегда преждевременная оптимизация беспокоится о вызове GC.Collect, прежде чем вы прототипируете или создаете приложение и проверяете его производительность. Обычно GC очень хорош в сборе памяти в соответствующие моменты времени. Он, безусловно, запускает коллекцию, пока ваше приложение не работает, особенно если в системе есть давление памяти.

Гораздо важнее, чтобы вы следовали методам распределения GC общего поколения (небольшие объекты, краткое использование и т.д.), и вы, скорее всего, получите характеристики производительности, которые вы хотите. Если у вас все еще нет необходимой производительности, после профилирования и хорошего дизайна вы можете подумать о GC.Collect как о решении.

Ответ 3

Как правило, нет причин для вызова GC.Collect().

В вашем случае нет никаких оснований называть его. Если вы простаиваете в течение часа, GC будет делать свои коллекции.

Ответ 4

Я надеюсь, что вы знаете, что вызов GC.Collect не приводит к сбору большего количества (или меньше) объектов.

Если вы пытаетесь оптимизировать время, знаете ли вы, что время GC берет для сбора объектов в вашем приложении? В настольных операционных системах (XP, Vista и т.д.) CLR использует параллельный GC, и он может запускаться без приостановки всех потоков в приложении на протяжении всей коллекции.

Явно вызов GC.Collect не рекомендуется, потому что

  • Он выдает алгоритм настройки CLR GC Tuning из строя. Тюнер определяет, когда запускать GC автоматически, и заставляя ручные GC беспорядок с его расчетами.

  • Заставляя коллекцию вручную, вы можете в конечном итоге продвигать объекты до поколения - объекты, которые могли быть собраны в следующем GC (если они были "потеряны" до того, как GC решила зайти).

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

Ответ 5

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

Другими словами, если вы действительно знаете, когда вам нужно позвонить GC.Collect(), и это не то, что вы плохо сделали в другом коде, то вы, вероятно, работаете для Внутренние среды CLR и могут только исправить проблему.

Ответ 6

Обычно GC вызывается только при попытке выделить новую память. Если у вас не хватает памяти, вы получаете 0% -ное улучшение производительности от вызова GC. У вас должно быть довольно безумно ресурсоемкое приложение, которое даже приблизится к пределам ОЗУ на сегодняшних компьютерах.

Если вы программируете множество внешних ресурсов (например, файлы или ссылки COM/DCOM), вы, возможно, захотите вызвать GC.

Если вызов GC даст вам душевное спокойствие, тогда идите вперед. Скорее всего, это не поможет, но это, конечно, не повредит.

Ответ 7

Да, как упоминалось в других сообщениях, GC знает, когда начать сбор лучше, чем вы, фактор, который не нажимает ни одна кнопка в вашем приложении, не означает, что настало время начать очистку, GC делает какие-то блокировки, когда перемещение объектов, поэтому это может привести к низкой производительности, если вы будете злоупотреблять GC.Collect