GC.Collect () - PullRequest
       52

GC.Collect ()

18 голосов
/ 19 июля 2009

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

Ответы [ 7 ]

28 голосов
/ 21 июля 2009

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

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

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

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

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

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

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

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

Надеюсь, это поможет.
Спасибо

19 голосов
/ 19 июля 2009

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

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

6 голосов
/ 19 июля 2009

Почти никогда нет веских причин для звонка GC.Collect().

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

4 голосов
/ 19 июля 2009

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

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

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

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

  2. Путем принудительного набора коллекции вы можете в конечном итоге продвигать объекты до поколения - объекты, которые могли быть собраны в следующем ГХ (если они были «осиротевшими» до того, как ГК решил начать работу). *

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

1 голос
/ 19 июля 2009

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

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

0 голосов
/ 19 июля 2009

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

0 голосов
/ 19 июля 2009

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

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

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

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