Основное отличие сборщика мусора с поддержкой SCOOP от обычного состоит в том, что он удаляет не только объекты, но и освобождает процессоры / регионы SCOOP. Активные объекты отслеживаются, начиная с корневых наборов, которые включают объекты, доступные из стеков вызовов, и после выполнения функции. Первые (стеки вызовов) безусловны, т.е. всегда включаются в корневые наборы, потому что соответствующие объекты участвуют в некоторых вычислениях. Вторые (однократные результаты функции) являются условными, поскольку их следует учитывать только тогда, когда соответствующий процессор / регион также доступен. В результате GC должен отслеживать как живые объекты, так и живые процессоры / регионы.
Когда процессор / регион становятся недоступными, соответствующий поток и ресурсы должны быть освобождены. Таким образом, сборщик мусора высвобождает не только память, но и вычислительную мощность. Учитывая, что живые объекты и живые процессоры / регионы взаимозависимы, алгоритм вычисляет фиксированную точку для живых объектов и живых процессоров / регионов. Это отличается от традиционного GC, который вычисляет фиксированную точку только для живых объектов. После этого вычисления сборщик мусора с поддержкой SCOOP восстанавливает мертвые объекты и мертвые процессоры. Подробное описание алгоритма с некоторыми тестами можно найти в статье «Процессоры и их коллекция».
Что касается сборки мусора объектов, то реализация в EiffelStudio в настоящее время использует упомянутый вами алгоритм: очистка поколений, отметка и очистка, сжатие памяти с традиционной адаптацией к многопоточности, когда записи в уже обработанные объекты записываются и учитываются сборщиком мусора.
person
Alexander Kogtenkov
schedule
17.08.2018