Доклад про паузы при сборке мусора уже был на одной из прошлых конференций HighLoad++.
Паузы stop-the-world являются неотъемлемым атрибутом автоматического управления памятью.
Или всё-таки их можно избежать? – Можно!
Алгоритмы, не требующие пауз для управления памятью, существуют. Существуют и реальные JVM, которые их реализуют.
Содержание доклада
- Принципы автоматического управления памятью (сборки мусора).
- "Метроном" - классический алгоритм сборки мусора без пауз.
- С4 - алгоритм сборки мусора Zing JVM (Azul Systems).
- Особенности эффективной реализации на x86-архитектуре.
- Дополнительные источники проблем: слабые ссылки, фрагментация и прочее.
2. Сборка мусора
Mark-Sweep
Фаза 1 – маркировка достижимых объектов
Фаза 2 – “вычистка” мусора
Copy collector (сборка копированием)
Использует две области памяти,
но выполняется в один проход
Mark-Sweep-Compact
Mark-Sweep + перемещение живых объектов
3. Барьеры
Барьеры – специальные процедуры, выполняемые
VM при каждом обращении к памяти.
Барьер на запись – при записи указателя в память.
Барьер на чтение – при чтении указателя из памяти.
JIT компиляция позволяет частично сократить
нагрузку барьеров за счёт глобальной
оптимизации.
4. Карточный барьер
Program
Memory
Dirty cards
0xABCD1200
entry.next = y;
mark card
write memory
0xABCD1200
table[n] = entry;
mark card
write memory
0xABCD1800
На каждые N байт памяти –
флаг в таблице карт
Любая запись указателя в
память, взводит флаг
0xABCD1400
0xABCD1600
0xABCD1400
0xABCD1600
11. Карточный барьер на запись
Фоновая маркировка с карточным барьером на
запись требует 2ух коротких пауз.
Так же, барьер на запись не позволяет
реализовать фоновое перемещение объектов.
Можно ли придумать лучший алгоритм,
используя барьер на чтение?
18. Алгоритм метроном
Алгоритм основан на сборке копированием.
В течение сборки каждый прикладной поток
При чтении указателя, каждый поток проверяет какой
области он принадлежит
Если адрес принадлежит “from” пространству, поток
выполняет нерекурсивное копирование объекта в “to” и
корректирует адрес.
Продлжает работу
26. На пути к решению
• Стоимость барьера на чтение
• Время копирования объекта
Например, большого массива
• Атомарное обнуление слабых ссылок
• Стоимость сборки мусора
Generational vs single spaced
27. Azul Vega – Java суперкомпьтер
2007 – Vega 2, 7200 series
up to 768 cores
768 GiB RAM
SPARC микорархитектура
hardware assisted garbage collection
28. LVB - барьер на загрузку указателя
Load Value Barrier
• Срабатывает при загрузке указателя из памяти в
регистр
• При срабатывании барьера происходит
коррекция источника в памяти
• Прикладной код работает только с
проверенными указателями
• При изменении правил барьера потоки
ревалидируют указатели в регистрах
30. Azul JVM
Доступ в память не требует арифметики
указателей
CPU спекулятивно выполняет код параллельно с
проверкой барьера
Проверка барьера одним условием
Допольнительные биты используются в процессе
маркировки и для работы со слабыми ссылками
31. Azul JVM
C4 (Continuously Concurrent Compacting Collector)
Инкрементальная сборка мусора регионами
Алгоритм сборки копированием
Барьер на чтение обеспечивает фоновую сборку
Generational
Регионы классифицируюся как молодые и старые
Фоновая маркировка для оценки “замусоренности” региона
С4 не является алгоритмом реального времени
33. Azul JVM
Mark – фоновая маркировка для выбора регионов
подлежащих сборке.
Relocate – копирования объектов.
Remap – рекурсивный обход графа и коррекция
ссылок.
Молодые сборки проходят параллельно
инкрементальных и включают только relocate
фазу.
34. Azul JVM
2010 Zing 4.0 – virtual appliance
2011 Zing 5.0
x86 (64 бит) архитектура
Linux
Механизм виртуальной памяти используется для
эмулации “незначащих” битов адреса.
35. Azul JVM
3 стратегии копирования
до 256 Kb – копирование байт между
страницами
256 Kb – 16 Mb – перемещаются 4k страницы
виртуальной памяти с последующей
дефрагментацией
Более 16 Mb – не перемещаются 2M страницы
виртуальной памяти
36. Без пауз ≠ Без проблем
“Безпаузный” алгоритм не спасет от
утечек памяти
неправильного сайзинга памяти JVM
свопинга
псевдо-свопинга (ожидания записи дискового кэша)
кривых рук (хотя существенно снижает риск)