Что является настолько неправильным относительно использования GC.Collect ()?

underscore.js

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

sortBy_.sortBy (list, iterator, [context ]) Возвращает отсортированную копию списка, ранжированную в порядке возрастания по результатам запуска каждого значения через итератор. Итератор также может быть строковым именем свойства для сортировки по (например, длине).

blockquote>
var objs = [ 
  { first_nom: 'Lazslo',last_nom: 'Jamf' },
  { first_nom: 'Pig', last_nom: 'Bodine'  },
  { first_nom: 'Pirate', last_nom: 'Prentice' }
];

var sortedObjs = _.sortBy( objs, 'first_nom' );

102
задан 9 revs 20 October 2008 в 00:36
поделиться

13 ответов

Из Блога Rico...

Правило № 1

не Делают.

Это - действительно самое важное правило. Справедливости ради стоит отметить, что большинство использований GC.Collect () является плохой идеей, и я вошел в это в некоторых деталях в orginal, отправляющем, таким образом, я не повторю все это здесь. Поэтому давайте идти дальше к...

Правило № 2

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

классический пример А этого - то, если Вы пишете клиентское приложение, и Вы отображаете очень большую и сложную форму, которая имеет много данных, связанных с ним. Ваш пользователь только что взаимодействовал с этой формой, потенциально создающей некоторые большие объекты... вещи как XML-документы или крупный DataSet или два. Когда форма закрывается, эти объекты мертвы и таким образом, GC.Collect () исправит память, связанную с ними...

, Таким образом, это походит, эта ситуация может подпасть под Правило № 2, Вы знаете, что существует момент вовремя, где много старых объектов умерло, и это является непериодическим. Однако не забывайте слова разделения Rico.

Правило № 1 должно превзойти Правило № 2 без убедительных доказательств.

Мера, мера, мера.

87
ответ дан Jon Norton 5 November 2019 в 11:29
поделиться

Сама Платформа.NET никогда не разрабатывалась для выполнения в среде реального времени. Если бы Вам действительно нужна обработка в режиме реального времени, Вы или использовали бы встроенный язык реального времени, который не основан на.NET, или используйте.NET Компактная Платформа, работающая на устройстве Windows CE.

1
ответ дан Scott Dorman 5 November 2019 в 11:29
поделиться

Нижняя строка, можно представить приложение и видеть, как эти дополнительные наборы влияют на вещи. Я предложил бы избегать его хотя, если Вы не собираетесь представить. GC разработан для заботы о себе и поскольку время выполнения развивается, они могут увеличить эффективность. Вы не хотите набор кода, бродящего вокруг, который может испачкать работы и не быть в состоянии использовать в своих интересах эти улучшения. Существует подобный аргумент в пользу использования foreach вместо для, то существо, тот, будущие улучшения под покрытиями могут быть добавлены к foreach, и Ваш код не должен изменяться для извлечения выгоды.

1
ответ дан Christopher Elliott 5 November 2019 в 11:29
поделиться

Требование назвать GC.Collect () обычно пытается покрыть ошибки, которые Вы сделали где-то в другом месте!

было бы лучше, если Вы находите, где Вы забыли располагать материал, Вам больше не было нужно.

2
ответ дан Sam 5 November 2019 в 11:29
поделиться

Что случилось с ним? То, что Вы пересматриваете сборщик "мусора" и средство выделения памяти, у которых между ними есть намного большая идея о фактическом использовании памяти Вашего приложения во времени выполнения, чем Вы.

2
ответ дан Rob 5 November 2019 в 11:29
поделиться

Я думаю, что Вы правы относительно сценария, но я не уверен в API.

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

2
ответ дан Sergio Acosta 5 November 2019 в 11:29
поделиться

GC.Collect вызова () вынуждает CLR сделать проход по стеку, чтобы видеть, может ли каждый объект быть истинно быть выпущенным путем проверки ссылок. Это будет влиять на масштабируемость, если количество объектов будет высоко, и, как также будет известно, инициирует сборку "мусора" слишком часто. Доверяйте CLR и позвольте сборщику "мусора" выполнить себя в надлежащих случаях.

7
ответ дан kd7 5 November 2019 в 11:29
поделиться

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

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

9
ответ дан wnoise 5 November 2019 в 11:29
поделиться

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

, Конечно, необходимо представить его и лично убедиться.

10
ответ дан TraumaPony 5 November 2019 в 11:29
поделиться

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

12
ответ дан TheZenker 5 November 2019 в 11:29
поделиться

Существуют ситуации, где это полезно, но в целом этого нужно избежать. Вы могли сравнить его с GOTO или поездкой на мопеде: Вы делаете это, когда Вы должны, но Вы не говорите Вашим друзьям об этом.

13
ответ дан rjohnston 5 November 2019 в 11:29
поделиться

При вызове GC.Collect () в производственном коде, Вы по существу объявляете знание больше тогда авторов GC. Это может иметь место. Однако это обычно не, и поэтому сильно препятствовавшее.

56
ответ дан GregC 5 November 2019 в 11:29
поделиться

Ну, GC является одной из тех вещей, с которыми у меня есть любовь / отношения ненависти. Мы имеем поврежденный это в прошлом через VistaDB и занесенный в блог об этом. Они зафиксировали его, но требуется много времени для получения, фиксирует от них на вещах как это.

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

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

можно завинтить всю машину с серией плохих GC.Collect операторы. Потребность в собрать операторе почти всегда указывает на большую базовую ошибку. Утечка памяти обычно имеет отношение к ссылкам и отсутствию понимания к тому, как они работают. Или использование IDisposable на объектах, которым не нужен он и создание намного более высокой нагрузки для GC.

Часы тесно % времени потрачен в GC через счетчики производительности системы. Если Вы видите, что Ваше приложение использует 20% или больше его времени в GC, у Вас есть серьезные проблемы управления объектами (или аварийный шаблон использования). Вы хотите всегда минимизировать время, которое проводит GC, потому что это ускорит Ваше целое приложение.

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

И только быть максимально полными в моем ответе необходимо также протестировать под Моно при предназначении для той платформы также. Так как это - полностью различная реализация, это может испытать полностью различные проблемы что реализация MS.

15
ответ дан jrh 5 November 2019 в 11:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: