Каковы подходы к оптимизации фазы оценки ГП без поколения? - PullRequest
0 голосов
/ 22 февраля 2019

Я работаю на Unity's Boehm-Demers-Weiser сборщик мусора , который является GC не поколения.

У меня есть большое дерево управляемых объектов в памяти (~ 100 тыс. Объектов, Выделение ~ 200 МБ).

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

Однако, поскольку Бем не является поколением,этот устаревший кеш никогда не переносится на старшие поколения.Это приводит к тому, что фаза метки занимает очень большое количество времени обработки, так как приходится обходить весь этот кэш в каждой коллекции, вызывая заметные пики отставания.

Это «по замыслу», какдокументация Unity гласит: :

Важно отметить, что сборка мусора в Unity, в которой используется алгоритм Boehm GC, не относится к поколению и не компактирует.«Non-Generation» означает, что GC должен проходить всю кучу при выполнении прохода сбора, и поэтому его производительность ухудшается при расширении кучи .

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

Более конкретно:

  • Есть ли способ пометить корневой указатель (например, статическое поле) как полностью игнорируемый в GC?
  • Существуют ли какие-либо шаблоны структуры данных, которые быстрее проходить в фазе пометки?
  • И наоборот,Существуют ли известные шаблоны структуры данных, которые препятствуют фазовой скорости метки?

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

1 Ответ

0 голосов
/ 25 февраля 2019

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

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

...