9

Какие модели оптимизации можно использовать для повышения производительности сборщика мусора?Как улучшить производительность сбора мусора?

Моей причиной для запроса является то, что я делаю много встроенного программного обеспечения с использованием Compact Framework. На медленных устройствах сбор мусора может стать проблемой, и я хотел бы уменьшить время, когда сборщик мусора заработает, и когда это произойдет, я хочу, чтобы он быстрее закончил. Я также вижу, что работа с сборщиком мусора, а не против него, может помочь улучшить любое приложение .NET или Java, особенно высокопроизводительные веб-приложения.

Вот некоторые из моих мыслей, но я не сделал никаких тестов.

  • повторное использование временных классов/массивов (держать вниз счет выделения)
  • сохранение количества живых объектов до минимума (быстрее коллекции)
  • пытаются использовать структуры вместо классов
+0

Я бы предложил изменить заголовок на «... улучшить .NET compact frameworok ...», чтобы результаты поиска были немного менее обманчивыми. – cdiggins

ответ

12

Ключ должен понять, как CF GC работает для распределений. Это простой механизм с меткой и разверткой, негенеративный GC с конкретными алгоритмами для того, что вызовет GC, и что вызовет уплотнение и/или качку после сбора. На уровне приложения почти ничего нельзя сделать для управления GC (единственным доступным методом является Collect, и его использование довольно ограничено, так как вы не можете заставить уплотнение в любом случае).

Повторное использование объекта - это хорошее начало, но простое сохранение количества объектов - это, вероятно, один из лучших инструментов, так как все корни нужно пройти для любой операции по сборке. Хранение этой прогулки - хорошая идея. Если уплотнение убивает вас, то предотвращение фрагментации фрагментов поможет. Объекты> 64k могут быть полезны в этом отношении, поскольку они получают свой собственный сегмент и обрабатываются иначе, чем объекты меньшего размера.

Чтобы понять, как работает CF GC, я бы рекомендовал посмотреть MSDN Webcast on CF memory management.

2

One Важным фактом является сохранение срока службы ваших объектов как можно короче.

+1

Не обязательно. Множество небольших короткоживущих объектов приведет к тому, что GC thrash станет хуже, чем просто несколько долгоживущих больших объектов и фактически усугубит его проблему. Это * не * настольная машина с настольной памятью и ресурсами процессора. – ctacke

+0

Я, кажется, помню, что совет от MS заключается в том, чтобы сохранить объекты как можно короче. Объекты, переживающие поколение 0, более проблематичны. –

+0

Я нашел ссылку на статью MSDN об этом. Кажется, это примерно за x10 замедление в генерации памяти. Статья находится по адресу: http://msdn.microsoft.com/en-us/magazine/dd882521.aspx#id0400035 –

2

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

[изменить] Еще одна распространенная технология getcha - конкатенация строк; если вы выполняете конкатенацию в цикле, используйте StringBuilder, который удалит лот промежуточных строк. Может быть, GC занят сбором всех заброшенных пузырей ваших строк?

2

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

0

Я слышал .NET Rocks показать на Rotor 2.0. Если вы действительно хардкор, вы можете загрузить Rotor, настроить источник и использовать собственный модифицированный сборщик мусора.

В любом случае этот подкаст имеет отличную информацию о GC. Я очень рекомендую слушать его.

3

Единственный важнейший аспект заключается в минимизации скорости распределения. Всякий раз, когда объект распределяется, ему требуется GC позже. Теперь, конечно, если объект small или shortlived, он будет пригвожден в молодое поколение (при условии, что GC является поколением). Большие предметы, как правило, идут прямо на арендованную арену. Но избежать необходимости собирать вообще еще лучше.

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

Вещь, которую следует остерегаться, - это вес стандартных библиотек и фреймворков. Вы обертываете пару объектов, и они будут заполняться довольно быстро. Помните, что всякий раз, когда что-то происходит в GC-куче, обычно используется немного больше места для GC-бухгалтерии.Таким образом, ваши 1000 указателей, выделенных индивидуально, намного больше, чем массив/вектор тех же указателей, поскольку последний может делиться GC-бухгалтерией. С другой стороны, последний, вероятно, останется в живых намного дольше.

+2

CF не является поколением - это чисто знак и развертка. – ctacke