Подтвердить что ты не робот

Имеет ли сборщик мусора GHC какие-либо специальные оптимизации для крупных объектов?

Собирает ли сборщик мусора GHC "большие" объекты? Или он относится к ним точно так же, как и любой другой объект?

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

4b9b3361

Ответ 1

Да. Куча GHC не сохраняется в одном непрерывном участке памяти; скорее, организован в блоки.

Когда размер выделенных объектов превышает определенный порог (block_size * 8/10, где block_size равен 4k, что примерно равно 3.2k), блок, содержащий объект, помечен как большой (BF_LARGE). Теперь, когда происходит сбор мусора, вместо копирования больших объектов из этого блока в новый, сам блок добавляется в набор блоков нового поколения; это включает возиться со связанным списком (точнее, с большим списком объектов).

Так как это означает, что нам может потребоваться некоторое время для восстановления мертвого пространства внутри большого блока, это означает, что большие объекты могут пострадать от фрагментации, как видно из ошибки 7831. Однако это обычно не происходит, пока отдельные распределения не достигнут половины размера мегаблока, 1M.