Я работаю на Unity's Boehm-Demers-Weiser сборщик мусора , который является GC не поколения.
У меня есть большое дерево управляемых объектов в памяти (~ 100 тыс. Объектов, Выделение ~ 200 МБ).
Эти объекты, по сути, являются кешем и никогда не выходят за пределы области видимости, поэтому они никогда не будут очищены GC.
Однако, поскольку Бем не является поколением,этот устаревший кеш никогда не переносится на старшие поколения.Это приводит к тому, что фаза метки занимает очень большое количество времени обработки, так как приходится обходить весь этот кэш в каждой коллекции, вызывая заметные пики отставания.
Это «по замыслу», какдокументация Unity гласит: :
Важно отметить, что сборка мусора в Unity, в которой используется алгоритм Boehm GC, не относится к поколению и не компактирует.«Non-Generation» означает, что GC должен проходить всю кучу при выполнении прохода сбора, и поэтому его производительность ухудшается при расширении кучи .
Я хорошо знаюподходов по сокращению повторяющегося выделения мусора, однако я не могу найти никакой информации о том, как оптимизировать большое, устаревшее базовое распределение в GC без генерации.
Более конкретно:
- Есть ли способ пометить корневой указатель (например, статическое поле) как полностью игнорируемый в GC?
- Существуют ли какие-либо шаблоны структуры данных, которые быстрее проходить в фазе пометки?
- И наоборот,Существуют ли известные шаблоны структуры данных, которые препятствуют фазовой скорости метки?
Эти вопросы являются лишь некоторыми из моих гипотез, чтобы решить эту проблему, но я открыт для всех предложений.