2010-04-08 2 views
2

Я читал blog entry от Джоша Смита, где использовал механизм кеша, чтобы «уменьшить фрагментацию обработанного кучи». Его кеширование уменьшает количество короткоживущих объектов, создаваемых за счет немного более медленной скорости выполнения.Когда обращаться к фрагментации управляемого кучи

Какова проблема с управлением фрагментацией кучи на управляемом языке, таком как C#? Как вы можете поставить диагноз, если это проблема? В каких ситуациях вам, как правило, нужно было бы это решить?

ответ

7

Когда

Не слишком быстро. Как правило, очень дешево иметь короткоживущие объекты. Для того, чтобы кеш был прибыльным, должно было быть (очень) много кандаадатов, и они должны жить достаточно долго, чтобы перейти к следующему поколению.

Как вы можете диагностировать, если это проблема?

С профилирующим устройством. Я не настолько уверен, что автор статьи сделал это.

Какая проблема связана с фрагментацией кучи в управляемом языке, таком как C#?

Насколько я знаю, это редкость. .NET имеет уплотняющий сборщик мусора, который предотвращает большинство форм фрагментации. Иногда возникают проблемы с большой областью объектов.


Edit:

Когда вы идете через комментарии ниже статье вы увидите, что кто-то измерил его и нашел тайник, чтобы быть намного медленнее, чем создание новых EventArgs каждый раз.

Заключение: Измерение перед началом оптимизации. Это не было хорошей идеей/примером.

+0

+1. Не выдерживает, когда люди проводят время «оптимизируя» без уважительной причины. –

+0

Да - кэширование происходит за счет скорости выполнения. –

+0

... но если он не позволяет GC собирать LOH ** все время **, он наверняка может оплатить – user492238

4

Если вы имеете дело с 10K + маленькими недолговечными объектами в секунду, это не должно быть проблемой вообще на современном компьютере с разумным объемом ОЗУ.

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

Если вы недовольны скоростью, вы видите, что код когда-то «задыхается» или просто любопытен, вы можете отслеживать различные статистические данные в формате .NET (http://msdn.microsoft.com/en-us/library/x2tyfybc.aspx) в приложении «Монитор производительности» (входит в состав Windows). В частности, вас интересует% Time in GC.

redgate ANTS profiler также контролирует эти характеристики.

+0

Обнаружена статья о коллекции перфмона и мусора http://codebetter.com/blogs/raymond.lewallen/archive/2005/03/31/60938.aspx –

1

Обрушение управляемого кучи обычно происходит из-за закрепления объектов. Объекты привязаны, когда управляемый код передает указатель объекта на собственный код, и объект нельзя перемещать, потому что ссылка передается в собственный код. Это очень распространено, когда есть много операций ввода-вывода. Как упоминалось выше, это обычно происходит только в LOH.

Вот пример Fragmentation in Gen0 Heap

+0

Поскольку объекты на LOH вообще не перемещаются, это не имеет никакого значения, если они также закреплены. – user492238

-1

В отличие от других ответов здесь я заявляю: да, нужно заботиться о фрагментации! Она применяется не только для управляемых куч, но для всех приложений обработки (по крайней мере)

  • много «большого» RESSOURCES в
  • тяжелый шаблон распределения.

Поскольку объект LOB не уплотняется, он со временем, скорее всего, будет фрагментирован, как только размер и количество объектов превысят определенное значение (которое относится к общему максимальному размеру кучи). Если это так, единственный безопасный способ - ограничить количество мгновенно удерживаемых ссылок на эти объекты. Кэш (пул) помог бы, если бы пул объектов можно было повторно использовать. Иногда, если эти ресурсы состоят из массивов различной длины f.e., они могут быть недоступны для повторного использования. Таким образом, объединение может не сильно помочь здесь.

Как его обнаружить? Когда когда-либо есть большое давление на кучу больших объектов. Как это узнать? Одновременно используйте счетчик производительности .NET «Collection Count Gen 0 ... 2». Если из большого объекта выделено слишком много больших объектов, все счетчики будут развиваться одинаково. Смысл, в основном все коллекции дорогой поколения 2 коллекции. В этом случае должно быть что-то сделано.

Что касается небольших объектов, я бы позволил GC выполнить всю работу в коллекциях Gen 0 и не волноваться.

+0

спасибо за нижний угол. пожалуйста, оставьте комментарий с некоторыми соображениями, чтобы можно было улучшить ответ, а другие могли бы извлечь выгоду из вашего опыта! – user492238

Смежные вопросы