Разработка сред управляемого исполнения на примере виртуальной машины Java Занятие 6

advertisement
Разработка сред управляемого
исполнения на примере
виртуальной машины Java
Занятие 6
Салищев С.И.
Неперемещающая GC
Не изменяет инвариантов других нитей, может работать
параллельно
Выделение памяти при помощи списка свободных блоков
Сохранение локальности данных (spatial locality)
Фрагментация памяти
При подсчете ссылок немедленная возможность возврата
памяти при обнулении счетчика
Подметающий (Sweep) алгоритм





последовательное сканирование кучи и возврат памяти
Сложность O(objectsCount)
Частичная очистка
Распараллеливание по блокам
Последовательный доступ к памяти (кэширование)
Копирующая GC
Требует изменения ссылок
Любой алгоритм выделения памяти
Возможность объединения свободных блоков
Возможно изменение локальности данных
(spatial locality)
Сложность O(liveObjectSize)
Случайный доступ к памяти
Упирается в скорость копирования памяти,
следовательно минимальный выигрыш от
распараллеливания на архитектурах с общей
памятью
Mark&Sweep
Алгоритм




Остановка пользовательских нитей
(Mark) Перечисление живых объектов методом
трассировки ссылок (tracing)
(Sweep) последовательное сканирование кучи и
возврат памяти
Возобновление пользовательских нитей
Используются параллельные версии
сканирования и подметания
Возможность переполнения стека при
сканировании ссылок
При возможности возврат страниц памяти OS
Concurrent Mark&Sweep (вариант)
Алгоритм






Конкурентная разметка
Конкурентный подбор изменений
сохраняющий трехцветный инвариант
Остановка нитей
Завершение разметки
Возобновление нитей
Параллельное подметание кучи
Mark&Compact
Уплотнение кучи – объединение свободных
блоков в непрерывную область
Алгоритм




Остановка пользовательских нитей
(Mark) Перечисление живых объектов методом
трассировки ссылок (tracing)
(Compact) уплотнение кучи и обновление ссылок
Возобновление пользовательских нитей
Сложность распараллеливания
Compact: 2 fingers
reference
free
free
copy
forward
live
Алгоритм






Указатель свободных блоков сканирует свободные блоки с начала кучи
Указатель занятых сканирует занятые с конца кучи
Занятые блоки из конца копируются на свободное место в начале
При перемещении блока на старом месте остается ссылка на новое
положение
Заканчивается при встрече указателей
Все ссылки в сжатой куче обновляются при помощи обратных ссылок
Линейное время, 2 прохода по куче – сжатие и обновление ссылок
Не полностью сжимает кучу из блоков различного размера
Разрушает локальность данных
Compact: Break Table
Алгоритм


Непрерывные занятые блоки последовательно сдвигаются к
началу кучи
При сдвиге блока с номером i в таблицу заносится (ai, si)
ai – адрес начала блока до сдвига
si – сдвиг


Для каждой ссылки r двоичным поиском в таблице находится
блок ai, такой ai ≤ r < ai+1
Значение ссылки заменяется на r’ = r – si
Для хранения таблицы используются пустые блоки
кучи
Для ускорения поиска в таблице используется хештаблица по старшим битам ссылки
Mark&Sweep&Compact
M&C может использоваться совместно
M&S при обнаружении избыточной
фрагментации
Избыточная фрагментация –
невозможность разместить
непрерывный блок в памяти при
наличии достаточного свободного места
в блоках меньшего размера
Полупространственный копирующий
GC (Semi-space copying GC)
From
To
copy
reference
forward
Алгоритм






Остановка нитей
Перечисление живых объектов методом трассировки ссылок
Живые объекты копируются из From в То во время трассировки
Восстановление ссылок используя обратные ссылки
From и To меняются местами
Возобновление нитей
Полупространственный копирующий
GC: Свойства
Одно из полупространств всегда пусто

Возможно нерациональное использование
виртуальной памяти
Долгоживущие объекты копируются при
каждой GC
Разрушение локальности данных при
копировании
Одновременное использование
нескольких GC
Класс объекта известен при создании – возможность выбора стратегии
размещения и сборки мусора для объекта
Возможные варианты:





Обычный – маленькие объекты, копирующая GC
Large Object Space – пространство больших объектов – неперемещающая
GC
Primitive Large Object Space – пространство больших массивов
примитивных типов, неперемещающая GC, не содержит ссылок, не требует
трассировки
Primitive Object Space – пространство массивов и маленьких объектов с
полями примитивных типов, копирующая GC, не содержит ссылок, не
требует трассировки
Old Space – пространство старых маленьких объектов, неперемещающая
GC, трассировка внешних ссылок при помощи запомненного множества
(remember set)
Недостаток: неэффективное использование виртуальной памяти на 32
бит платформе при большом количестве пространств
Конкурентная эвакуация
Эвакуация объектов производится одновременно с
исполнением пользовательского кода
“То” инвариант



Пользовательский код видит только объекты в целевом
пространстве
Реализуется с помощью Read/Write барьера отслеживающего
ссылку на новое положение в заголовке объекта
Пример: Metronome
Эквивалентность объектов в “From” и “То”



Объекты в целевом и исходном пространстве гарантированно
имеют одинаковые значения полей
Реализуется при помощи Write барьера обновляющего значения
полей в обоих пространствах при наличии ссылки на новое
положение в заголовке объекта
Пример: Sapphire
Sun Generational GC
Память разделена на Новую область (New Region) и Старую
область (Old Region)
Новая область разбита на Кущи (Eden) и 2 полупространства
для выживших (“Survivor” semi-spaces) From и To
Во всех частях Новой области используется последовательное
выделение памяти
Новые объекты создаются в кущах
При заполнении Кущей живые объекты копируются в “To”
“To” и “From” меняются местами
В следующий раз При заполнении Кущей, живые объекты из
Кущей и “From” копируются в “To”
Существует время владения (Tenuring Threshold) определяющее
количество раз объект может быть скопирован между
полупространствами для выживших перед перемещением в
Старую область
Пример
New Object Region Old Object Region
First
GC
Second
GC
Eden
SS1
SS2
Old
Eden
SS1
SS2
Old
Eden
SS2
SS1
Old
Eden
SS2
SS1
Old
Eden
SS2
SS1
Old
Download