Хорошо, я прочитал пару тем об этом, но здесь он идет. Представим себе, что у меня есть приложение, в котором я каждый раз нажимаю на кнопку, много чего случится в течение пары минут, а затем он будет оставаться без дела в течение еще одного часа или, может быть, всего лишь 1 минута. Не только после того, как все это закончится хорошей ситуацией, чтобы назвать GC.Collect? Я имею в виду, я знаю, что в тот момент я не буду использовать свое приложение, и GC не может догадаться.GC.Collect()
ответ
Я вижу, что несколько человек ушли из-за того, что не рекомендуют звонить 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 будет агрессивен в любом случае и будет автоматически срабатывать, если на устройстве высокое давление памяти на аппарате.
- Если вы хотите избежать попадания в ситуацию с низкой памятью и хотите с нетерпением ждать.
Надеется, что это помогает.
Сказал (а) спасибо
Существует почти никогда не веская причина для звонка GC.Collect()
.
В вашем случае нет оснований называть это. Если вы простаиваете в течение часа, GC будет делать свои коллекции.
Да, но это может быть на следующей минуте. Но только когда я заканчиваю свою обработку, я знаю, что в тот момент не будет удара производительности, если я возьму пару секунд, чтобы сделать GC.Collect(). –
+1. вызов GC.Collect() может фактически способствовать жизни объекта –
Что значит продвижение жизни объекта? –
Это почти всегда преждевременная оптимизация, чтобы беспокоиться о вызове GC.Collect, прежде чем вы прототипировали или создали приложение и протестировали его производительность. Обычно GC очень хорош в сборе памяти в соответствующие моменты времени. Он, безусловно, будет запускать коллекцию, пока ваше приложение не работает, особенно если в системе имеется давление памяти.
Гораздо важнее, чтобы вы следовали правилам распределения GC общего поколения (небольшие объекты, краткое использование и т. Д.), И вы, скорее всего, получите характеристики производительности, которые вы хотите. Если у вас все еще нет необходимой производительности, после профилирования и хорошего дизайна вы можете подумать о GC.Collect как о решении.
Чтобы узнать, когда позвонить по номеру GC.Collect()
, вам необходимо знать детали конкретного сборщика, связанные с временем выполнения, а также подробную информацию о слабой точке, которую вы можете решить с помощью коллекции.
Другими словами, если вы действительно знаете, когда вам нужно позвонить GC.Collect()
, и это не то, что вы сделали плохо в другом коде, то вы, вероятно, работаете на CLR Internals и можете исправить эту проблему.
Моя точка зрения в основном такова: нет ничего плохого, что может случиться, если мы GC.Collect(), правильно? Если нет ничего плохого, тогда нечего терять, если мы сделаем это сейчас, когда узнаем, что по крайней мере на мгновение наш процесс будет бездействующим, вместо того, чтобы сделать это в какой-то случайный момент. Или что-то здесь, что мне не хватает? Спасибо –
Да, вызов GC.Collect() может оказать разрушительное влияние на производительность вашей программы. Или он ничего не мог сделать. Важно помнить: в отличие от ранних Java, современные GC ** очень хорошо работают на своей работе и почти никогда не являются виновниками проблем с производительностью приложений. На самом деле, .NET и Java GC быстрее, чем многие реализации C/C++-распределителей. –
Как это может оказать разрушительное влияние на производительность моей программы? Я бы сказал, что это окажет разрушительное влияние на производительность моей программы, если случайно это произойдет только во время моего процесса, а не тогда, когда я знаю, что он будет бездействовать. –
Я надеюсь, что вы знаете, что вызов GC.Collect не вызывает больше (или меньше) объектов для сбора.
Если вы пытаетесь оптимизировать время, знаете ли вы, сколько времени занимает GC для сбора объектов в вашем приложении? В настольных операционных системах (XP, Vista и т. Д.) CLR использует параллельный GC, и он может работать без приостановки всех потоков в приложении на время сбора.
Явный вызов GC.Collect не рекомендуется, потому что
Он бросает алгоритм CLR GC Tuning из передач. Тюнер определяет, когда запускать GC автоматически, и заставлять ручные GC беспорядок с его расчетами.
Выбирая коллекцию вручную, вы можете создать объекты, которые могли бы быть собраны в следующем GC (если бы они были «потеряны», прежде чем GC решила нанести удар).
Вы могли бы найти это интересно, что .NET 4.0, GC notification mechanism была введена для этих видов сценариев.
Спасибо за ответ. Я не уверен, что получил следующее: «Знаете ли вы, что время GC принимает для сбора объектов в вашем приложении? В настольных операционных системах (XP, Vista и т. Д.) CLR использует параллельный GC, и он может работать без приостановки всех потоков в приложении на время сбора. ". Из того, что я читал, кажется, что коллекция GC довольно быстро (не нужно больше времени на ошибку страницы для одного поколения 0). О вашей точке 2), хорошо, что это не кажется хорошим аргументом. То же самое относится к тому, когда вы делаете обычный GC. –
Если коллекция GC довольно быстро, зачем беспокоиться о ней вручную, чтобы сэкономить время? Что касается второго момента, конечно, то же самое происходит, когда происходит обычный GC, но затем GC решает, когда его запускать, что снова определяется алгоритмом настройки GC. Он может понять, что существует образец в том, как ваше приложение распределяет объекты, и использовать эти знания для запуска GC в максимально возможное время w.r.t памяти - в этом случае немного позже. Это будет собирать больше объектов и продвигать меньше. –
Это только дает мне впечатление, что люди считают, что GC теперь лучше, чем мы, программисты, как работает наша программа. Я могу теперь, что мой процесс возникает каждый раз, когда мой компьютер простаивает 2 минуты, мне трудно поверить, что GC теперь будет тем же самым. Весь аргумент знания, когда это лучшее время для GC по сравнению с ручным GC, кажется, не твердый, просто это. –
Обычно GC вызывается только при попытке выделить новую память. Если у вас не хватает памяти, вы получаете 0% -ное улучшение производительности от вызова GC. У вас должно быть довольно безумно ресурсоемкое приложение, которое даже приблизится к пределам ОЗУ на сегодняшних компьютерах.
Если у вас запрограммировано множество внешних ресурсов (например, файлы или ссылки COM/DCOM), вы потенциально захотите вызвать GC.
Если вы звоните в ГК, вы получите спокойствие, а затем идите вперед. Скорее всего, это не поможет, но это, конечно, не повредит.
Ум. Люди запускают программное обеспечение на старых машинах. Когда я помогаю людям очищать свои машины, чтобы они работали лучше, я часто нахожу программное обеспечение с использованием рабочего набора 50-100 МБ, чтобы он мог зависнуть в ожидании интернет-звонка или что-то еще смешное. На машине 1 ГБ эти вещи складываются быстро! –
Да, как упоминалось в других сообщениях, GC знает, когда лучше начать собирать коллекцию, фактор, который не нажимают кнопки в приложении, не означает, что настало время начать очистку, GC делает какие-то блокировки при перемещении объектов, так что это может привести к низкой производительности, если вы будете злоупотреблять GC.Collect
Ах, наконец ... –
:) Как я уже упоминал, не принимайте мою рекомендацию в качестве общего правила, это исключительный случай; что только что случилось с вашим делом :) – mfawzymkh
Ваш второй пункт неверен. По умолчанию используется принудительный режим –