Разумно ли использовать GC.Collect в приложении, которое работает 24 часа в сутки? - PullRequest
5 голосов
/ 23 января 2012

У нас есть приложение, которое работает 24 часа в сутки и 7 дней в неделю.Иногда процессор переходит на 100%, а затем возвращается к 80%.То же самое с оперативной памятью.Разумно ли вручную звонить GC.Collect через несколько часов или лучше оставить его автоматически.

Мы используем C # 2010, SQL 2008 и Fluent Nhiberanet.Это настольное приложение.

Ответы [ 6 ]

11 голосов
/ 23 января 2012

Я бы не назвал это умным, чтобы звонить GC.Collect() "каждые несколько часов" или "когда использование ОЗУ становится высоким", но я бы назвал это умным, чтобы звонить, когда вы в состоянии иметь большеинформация, чем сборщик мусора, некоторые примеры

  • Вы знаете, этот большой кусок оперативной памяти или эти многочисленные мелкие объекты, которые вы только что выделили , больше не будут использоваться, и вы находитесь в однопоточномокружение и (конечно) вы очистили все свои ссылки
  • Вы знаете, что "разрыв ГК" повредит меньше сейчас, чем чуть позже

ГК оченьоптимизированный код и довольно умный, но он может работать только на имеющейся информации.

2 голосов
/ 23 января 2012

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

Посмотрите наниже я думаю, что это действительно стоит прочитать

Глава 5 - Повышение производительности управляемого кода

1 голос
/ 23 января 2012

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

1 голос
/ 23 января 2012

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

0 голосов
/ 23 января 2012

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

Если у вас есть приложение, работающее 24/7, я бы порекомендовал следующее:

  • очень серьезно проверить утечки памяти и исправить любую такую ​​утечку (используя несколько профилировщиков памяти)
    Если вам нужны какие-либо ссылки, скажите, пожалуйста ...

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

  • настроить приложение на использование ГХ в «режиме сервера», так как он предназначен для круглосуточной работы (подробности см. здесь )
    Это не чудодейственное решение, а то, что вы должны попробовать с вашим приложением и сравнить, дает ли оно вам какие-либо преимущества.

0 голосов
/ 23 января 2012

Краткий ответ: нет.

Сборщик мусора - это не та область, в которую вы хотите попасть, если только вам это не нужно.Обычно среда выполнения .net неплохо справляется с вызовами, когда это необходимо.Если вы сами это называете, это просто дополнительные затраты.

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