cборка мусора в java без пауз (highload++ 2013)

Post on 05-Dec-2014

2.699 Views

Category:

Documents

7 Downloads

Preview:

Click to see full reader

DESCRIPTION

Доклад про паузы при сборке мусора уже был на одной из прошлых конференций HighLoad++. Паузы stop-the-world являются неотъемлемым атрибутом автоматического управления памятью. Или всё-таки их можно избежать? – Можно! Алгоритмы, не требующие пауз для управления памятью, существуют. Существуют и реальные JVM, которые их реализуют. Содержание доклада - Принципы автоматического управления памятью (сборки мусора). - "Метроном" - классический алгоритм сборки мусора без пауз. - С4 - алгоритм сборки мусора Zing JVM (Azul Systems). - Особенности эффективной реализации на x86-архитектуре. - Дополнительные источники проблем: слабые ссылки, фрагментация и прочее.

TRANSCRIPT

Сборка мусора в Java без пауз

Алексей Рагозин

Сборка мусора

Mark-Sweep Фаза 1 – маркировка достижимых объектов

Фаза 2 – “вычистка” мусора

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

но выполняется в один проход

Mark-Sweep-Compact Mark-Sweep + перемещение живых объектов

Барьеры

Барьеры – специальные процедуры, выполняемые VM при каждом обращении к памяти.

Барьер на запись – при записи указателя в память.

Барьер на чтение – при чтении указателя из памяти.

JIT компиляция позволяет частично сократить нагрузку барьеров за счёт глобальной оптимизации.

Карточный барьер

На каждые N байт памяти – флаг в таблице карт

Любая запись указателя в память, взводит флаг

0xABCD1800

Memory

0xABCD1200

0xABCD1400

0xABCD1600

Dirty cards

0xABCD1200

0xABCD1400

0xABCD1600

Program

entry.next = y;

mark card

write memory

table[n] = entry;

mark card

write memory

0xABCD1200

0xABCD1600

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

roo

ts

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

roo

ts

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

roo

ts

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

roo

ts

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

roo

ts

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

roo

ts

Карточный барьер на запись

Фоновая маркировка с карточным барьером на запись требует 2ух коротких пауз.

Так же, барьер на запись не позволяет реализовать фоновое перемещение объектов.

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

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

FROM

TO

roo

ts

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

FROM

TO

roo

ts

FROM

TO

roo

ts

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

FROM

TO

roo

ts

FROM

TO

roo

ts

1

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

FROM

TO

roo

ts

FROM

TO

roo

ts

1 2

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

FROM

TO

roo

ts

FROM

TO

roo

ts

1 2

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

FROM

TO

roo

ts

FROM

TO

roo

ts

1 23

Алгоритм метроном

Алгоритм основан на сборке копированием.

В течение сборки каждый прикладной поток

При чтении указателя, каждый поток проверяет какой области он принадлежит

Если адрес принадлежит “from” пространству, поток выполняет нерекурсивное копирование объекта в “to” и корректирует адрес.

Продлжает работу

Метроном

FROM

TO

roo

ts

1

GC thread

Application thread

V1

Метроном

FROM

TO

roo

ts

1

GC thread

Application thread

V1

Метроном

FROM

TO

roo

ts

1 2

GC thread

Application thread

V1

Метроном

FROM

TO

roo

ts

1 2

GC thread

Application thread

V1

Метроном

FROM

TO

roo

ts

1 2

GC thread

Application thread

V1

3

Метроном

FROM

TO

roo

ts

1 24

GC thread

Application thread

V1

3

Метроном

FROM

TO

roo

ts

1 24

GC thread

Application thread

V1

3

На пути к решению

• Стоимость барьера на чтение

• Время копирования объекта Например, большого массива

• Атомарное обнуление слабых ссылок

• Стоимость сборки мусора 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

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

Flags OffsetPage

064

Адрес в памяти

Таблица LVB триггеров

LVB tag

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

top related