Cборка мусора в Java без пауз (HighLoad++ 2013)

A
Сборка мусора в Java
без пауз
Алексей Рагозин
Сборка мусора
Mark-Sweep
 Фаза 1 – маркировка достижимых объектов
 Фаза 2 – “вычистка” мусора

Copy collector (сборка копированием)
 Использует две области памяти,
но выполняется в один проход

Mark-Sweep-Compact
 Mark-Sweep + перемещение живых объектов
Барьеры
Барьеры – специальные процедуры, выполняемые
VM при каждом обращении к памяти.
Барьер на запись – при записи указателя в память.
Барьер на чтение – при чтении указателя из памяти.
JIT компиляция позволяет частично сократить
нагрузку барьеров за счёт глобальной
оптимизации.
Карточный барьер
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
roots

Фоновая маркировка
roots

Фоновая маркировка
roots

Фоновая маркировка
roots

Фоновая маркировка
roots

Фоновая маркировка
roots

Фоновая маркировка
Карточный барьер на запись
Фоновая маркировка с карточным барьером на
запись требует 2ух коротких пауз.
Так же, барьер на запись не позволяет
реализовать фоновое перемещение объектов.

Можно ли придумать лучший алгоритм,
используя барьер на чтение?
roots

Сборка копированием

FROM

TO
roots

Сборка копированием

FROM

TO
roots

Сборка копированием

FROM

TO

1
roots

Сборка копированием

FROM

TO

1

2
roots

Сборка копированием

FROM

TO

1

2
roots

Сборка копированием

FROM

TO

3

1

2
Алгоритм метроном
Алгоритм основан на сборке копированием.
В течение сборки каждый прикладной поток
 При чтении указателя, каждый поток проверяет какой
области он принадлежит
 Если адрес принадлежит “from” пространству, поток
выполняет нерекурсивное копирование объекта в “to” и
корректирует адрес.

 Продлжает работу
Метроном
roots

GC thread

Application thread
V1

FROM

TO

1
Метроном
roots

GC thread

Application thread
V1

FROM

TO

1
Метроном
roots

GC thread

Application thread
V1

FROM

TO

1

2
Метроном
roots

GC thread

Application thread
V1

FROM

TO

1

2
Метроном
roots

GC thread

Application thread
V1

FROM

TO

1

3

2
Метроном
roots

GC thread

Application thread
V1

FROM

TO

4

1

3

2
Метроном
roots

GC thread

Application thread
V1

FROM

TO

4

1

3

2
На пути к решению
• Стоимость барьера на чтение
• Время копирования объекта
 Например, большого массива

• Атомарное обнуление слабых ссылок
• Стоимость сборки мусора
 Generational vs single spaced
Azul Vega – Java суперкомпьтер
2007 – Vega 2, 7200 series
 up to 768 cores
 768 GiB RAM
 SPARC микорархитектура
 hardware assisted garbage collection
LVB - барьер на загрузку указателя
Load Value Barrier
• Срабатывает при загрузке указателя из памяти в
регистр
• При срабатывании барьера происходит
коррекция источника в памяти
• Прикладной код работает только с
проверенными указателями
• При изменении правил барьера потоки
ревалидируют указатели в регистрах
Azul JVM
Таблица
LVB триггеров

64 битный адрес
(хранимый в памяти)
LVB tag
Flags

Page

Offset

64

0

Адрес в памяти
Azul JVM
Доступ в память не требует арифметики
указателей
CPU спекулятивно выполняет код параллельно с
проверкой барьера
Проверка барьера одним условием

Допольнительные биты используются в процессе
маркировки и для работы со слабыми ссылками
Azul JVM
C4 (Continuously Concurrent Compacting Collector)
 Инкрементальная сборка мусора регионами
 Алгоритм сборки копированием
 Барьер на чтение обеспечивает фоновую сборку

 Generational
 Регионы классифицируюся как молодые и старые

 Фоновая маркировка для оценки “замусоренности” региона

С4 не является алгоритмом реального времени
Azul JVM

http://www.azulsystems.com/sites/default/files/images/c4_paper_acm.pdf
Azul JVM
Mark – фоновая маркировка для выбора регионов
подлежащих сборке.
Relocate – копирования объектов.
Remap – рекурсивный обход графа и коррекция
ссылок.

Молодые сборки проходят параллельно
инкрементальных и включают только relocate
фазу.
Azul JVM
2010 Zing 4.0 – virtual appliance
2011 Zing 5.0
 x86 (64 бит) архитектура
 Linux
Механизм виртуальной памяти используется для
эмулации “незначащих” битов адреса.
Azul JVM
3 стратегии копирования
 до 256 Kb – копирование байт между
страницами
 256 Kb – 16 Mb – перемещаются 4k страницы
виртуальной памяти с последующей
дефрагментацией
 Более 16 Mb – не перемещаются 2M страницы
виртуальной памяти
Без пауз ≠ Без проблем
“Безпаузный” алгоритм не спасет от
 утечек памяти
 неправильного сайзинга памяти JVM
 свопинга
 псевдо-свопинга (ожидания записи дискового кэша)
 кривых рук (хотя существенно снижает риск)
Спасибо
Алексей Рагозин (alexey.ragozin@gmail.com)

http://blog.ragozin.info
http://aragozin.timepad.ru
1 of 37

More Related Content

What's hot(19)

Алексей ФедоровАлексей Федоров
Алексей Федоров
CodeFest967 views
Экосистема Common LispЭкосистема Common Lisp
Экосистема Common Lisp
Vsevolod Dyomkin1.6K views

Cборка мусора в Java без пауз (HighLoad++ 2013)