Секреты сборки мусора в Java (Алексей Рагозин)
Transcript of Секреты сборки мусора в Java (Алексей Рагозин)
![Page 2: Секреты сборки мусора в Java (Алексей Рагозин)](https://reader036.fdocuments.in/reader036/viewer/2022062303/555e1c3fd8b42a6a4c8b463a/html5/thumbnails/2.jpg)
О чём этот доклад?• Обзор проблемы автоматического
управления памятью• Stop-the-world паузы – причины• Сборка мусора в современных JVM
![Page 3: Секреты сборки мусора в Java (Алексей Рагозин)](https://reader036.fdocuments.in/reader036/viewer/2022062303/555e1c3fd8b42a6a4c8b463a/html5/thumbnails/3.jpg)
Сборка мусораЯзыки использующие автоматическое управление памятью Java, JavaScript, Erlang, Haskell, Python, PHP, C#, Ruby, Perl, SmallTalk, OCaml, List, Scala, ML, Go, D, … … and counting
Языки не использующие автоматическое управление памятью C, C++, Pascal/Delphi, Objective-C Что я забыл?
![Page 4: Секреты сборки мусора в Java (Алексей Рагозин)](https://reader036.fdocuments.in/reader036/viewer/2022062303/555e1c3fd8b42a6a4c8b463a/html5/thumbnails/4.jpg)
Способы сборки мусораМусор – структура данных (объект) в памяти не достижимый из программного кода.
Подсчёт ссылокТранзитивное замыкание ссылок Вообще не собирать
![Page 5: Секреты сборки мусора в Java (Алексей Рагозин)](https://reader036.fdocuments.in/reader036/viewer/2022062303/555e1c3fd8b42a6a4c8b463a/html5/thumbnails/5.jpg)
Подсчёт ссылок+ Просто+ Не требует пауз для сбора мусора– Не очищает циклические графы– Дополнительные 15-30% нагрузки CPU– Плохо сочетается с много поточностью
![Page 6: Секреты сборки мусора в Java (Алексей Рагозин)](https://reader036.fdocuments.in/reader036/viewer/2022062303/555e1c3fd8b42a6a4c8b463a/html5/thumbnails/6.jpg)
Транзитивное замыкание ссылок• Корневой набор ссылок
Статические переменные Локальные переменные
• Объекты достижимые из корневых ссылок – живые• Объекты недостижимые из корневых ссылок – мусорВ общем случае, граф объектов не должен меняться по мере обхода.
Следовательно, приложение должно быть остановлено пока идёт сборка мусора.
![Page 7: Секреты сборки мусора в Java (Алексей Рагозин)](https://reader036.fdocuments.in/reader036/viewer/2022062303/555e1c3fd8b42a6a4c8b463a/html5/thumbnails/7.jpg)
Алгоритмы сборки мусора• Mark-Sweep-Compact
Фаза 1 – маркировка достижимых объектов Фаза 2 – “вычистка” мусора
• Copy collector (сборка копированием) Использует две области памяти, но выполняется в один проход
• Mark-Sweep-Compact Mark-Sweep + перемещение живых объектов
![Page 8: Секреты сборки мусора в Java (Алексей Рагозин)](https://reader036.fdocuments.in/reader036/viewer/2022062303/555e1c3fd8b42a6a4c8b463a/html5/thumbnails/8.jpg)
Трёх цветная маркировкаroots
![Page 9: Секреты сборки мусора в Java (Алексей Рагозин)](https://reader036.fdocuments.in/reader036/viewer/2022062303/555e1c3fd8b42a6a4c8b463a/html5/thumbnails/9.jpg)
Трёх цветная маркировкаroots
roots
![Page 10: Секреты сборки мусора в Java (Алексей Рагозин)](https://reader036.fdocuments.in/reader036/viewer/2022062303/555e1c3fd8b42a6a4c8b463a/html5/thumbnails/10.jpg)
Трёх цветная маркировкаroots
roots
![Page 11: Секреты сборки мусора в Java (Алексей Рагозин)](https://reader036.fdocuments.in/reader036/viewer/2022062303/555e1c3fd8b42a6a4c8b463a/html5/thumbnails/11.jpg)
Трёх цветная маркировкаroots
roots
![Page 12: Секреты сборки мусора в Java (Алексей Рагозин)](https://reader036.fdocuments.in/reader036/viewer/2022062303/555e1c3fd8b42a6a4c8b463a/html5/thumbnails/12.jpg)
Сборка копированием
FROM
TO
roots
![Page 13: Секреты сборки мусора в Java (Алексей Рагозин)](https://reader036.fdocuments.in/reader036/viewer/2022062303/555e1c3fd8b42a6a4c8b463a/html5/thumbnails/13.jpg)
Сборка копированием
FROM
TO
roots
FROM
TO
roots
![Page 14: Секреты сборки мусора в Java (Алексей Рагозин)](https://reader036.fdocuments.in/reader036/viewer/2022062303/555e1c3fd8b42a6a4c8b463a/html5/thumbnails/14.jpg)
Сборка копированием
FROM
TO
roots
FROM
TO
roots
1
![Page 15: Секреты сборки мусора в Java (Алексей Рагозин)](https://reader036.fdocuments.in/reader036/viewer/2022062303/555e1c3fd8b42a6a4c8b463a/html5/thumbnails/15.jpg)
Сборка копированием
FROM
TO
roots
FROM
TO
roots
1 2
![Page 16: Секреты сборки мусора в Java (Алексей Рагозин)](https://reader036.fdocuments.in/reader036/viewer/2022062303/555e1c3fd8b42a6a4c8b463a/html5/thumbnails/16.jpg)
Сборка копированием
FROM
TO
roots
FROM
TO
roots
1 2
![Page 17: Секреты сборки мусора в Java (Алексей Рагозин)](https://reader036.fdocuments.in/reader036/viewer/2022062303/555e1c3fd8b42a6a4c8b463a/html5/thumbnails/17.jpg)
Сборка копированием
FROM
TO
roots
FROM
TO
roots
1 23
![Page 18: Секреты сборки мусора в Java (Алексей Рагозин)](https://reader036.fdocuments.in/reader036/viewer/2022062303/555e1c3fd8b42a6a4c8b463a/html5/thumbnails/18.jpg)
Экономика сборки мусораS – объём кучиL – объём живых объектов
Copy collection ЭффективностьMark-Sweep Эффективность
L
LSc
S
LSc
L
LSc
21
Объём мусора в куче
![Page 19: Секреты сборки мусора в Java (Алексей Рагозин)](https://reader036.fdocuments.in/reader036/viewer/2022062303/555e1c3fd8b42a6a4c8b463a/html5/thumbnails/19.jpg)
Слабая гипотеза о поколенияхПостулаты Большинство объектов умирают молодыми Число ссылок на молодые объекты мало
СледствиеЕсли хранить молодые и старые объекты отдельно, можно
обеспечить высокую пропускную способность (молодое поколение) и эффективное использование памяти (старое поколение).
![Page 20: Секреты сборки мусора в Java (Алексей Рагозин)](https://reader036.fdocuments.in/reader036/viewer/2022062303/555e1c3fd8b42a6a4c8b463a/html5/thumbnails/20.jpg)
Демография объектов в куче
См
ертн
ость
(б
айт/
с)
Возраст объектов
Период молодой сборки
Период старой сборки
∞
![Page 21: Секреты сборки мусора в Java (Алексей Рагозин)](https://reader036.fdocuments.in/reader036/viewer/2022062303/555e1c3fd8b42a6a4c8b463a/html5/thumbnails/21.jpg)
Generational collection Молодое поколение
Сборщик настроен на пропускную способность Старое поколение
Сборщик настроен на эффективное использование памяти Продвижение (promotion) объектов в старое поколение
Сборщик молодого поколения копирует живые объекты в старое поколение после достижения “зрелого” возраста
![Page 22: Секреты сборки мусора в Java (Алексей Рагозин)](https://reader036.fdocuments.in/reader036/viewer/2022062303/555e1c3fd8b42a6a4c8b463a/html5/thumbnails/22.jpg)
Generational collectionКак получить все указатели из старого поколения на молодое?Ответ - write barrier Каждый раз при записи указателя в память в “старом” пространстве, срабатывает барьер
![Page 23: Секреты сборки мусора в Java (Алексей Рагозин)](https://reader036.fdocuments.in/reader036/viewer/2022062303/555e1c3fd8b42a6a4c8b463a/html5/thumbnails/23.jpg)
Молодая сборка HotSpot JVMEden S1 S2 Tenured
Dirty cards
Collect roots for young GCScan stack tracesScan dirty pages in old space
Сбор Сбор ““корневыхкорневых”” ссылок ссылок
![Page 24: Секреты сборки мусора в Java (Алексей Рагозин)](https://reader036.fdocuments.in/reader036/viewer/2022062303/555e1c3fd8b42a6a4c8b463a/html5/thumbnails/24.jpg)
Молодая сборка HotSpot JVMEden S1 S2 Tenured
Dirty cards
Collect roots for young GCClean cardsRecursive copy of live objects (only live objects are traversed)
Копирование живых объектовКопирование живых объектов
![Page 25: Секреты сборки мусора в Java (Алексей Рагозин)](https://reader036.fdocuments.in/reader036/viewer/2022062303/555e1c3fd8b42a6a4c8b463a/html5/thumbnails/25.jpg)
Молодая сборка HotSpot JVMEden S1 S2 Tenured
Dirty cards
Сборка законченаСборка закончена
Области памяти, не помеченные в таблице карт, не могут содержать ссылки на молодое поколение
![Page 26: Секреты сборки мусора в Java (Алексей Рагозин)](https://reader036.fdocuments.in/reader036/viewer/2022062303/555e1c3fd8b42a6a4c8b463a/html5/thumbnails/26.jpg)
Stop-the-world паузы• Изменение графа объектов во время обхода
может привести к пропуску достижимых объектов
• Большинство managed runtimes может перемещать объекты только в режиме паузы
![Page 27: Секреты сборки мусора в Java (Алексей Рагозин)](https://reader036.fdocuments.in/reader036/viewer/2022062303/555e1c3fd8b42a6a4c8b463a/html5/thumbnails/27.jpg)
Stop-the-world паузыПараллельные (parallel) алгоритмы Используют несколько потоков чтобы сократить время пауз
Конкурентные (concurrent) алгоритмы Выполняют большую часть работы в фоновом режиме (без STW пауз)
Инкрементальные алгоритмы Много маленьких STW вместо одной длитетьной
![Page 28: Секреты сборки мусора в Java (Алексей Рагозин)](https://reader036.fdocuments.in/reader036/viewer/2022062303/555e1c3fd8b42a6a4c8b463a/html5/thumbnails/28.jpg)
Concurrent markingПроблема Граф объектов меняется по мере обхода * * Даже в функциональных языках могут выполняться отложенные вычисления, меняющие граф
Решение write-barrier – отслеживать ссылки изменившиеся за время обхода
![Page 29: Секреты сборки мусора в Java (Алексей Рагозин)](https://reader036.fdocuments.in/reader036/viewer/2022062303/555e1c3fd8b42a6a4c8b463a/html5/thumbnails/29.jpg)
Concurrent marking Card marking write barrier
HotSpot CMS, JRockit, IBM J9 Snapshot-at-the-beginning (SATB) write barrier
HotSpot G1 Read barrier (помечать объекты как живые при
чтении) Azul Zing JVM
![Page 30: Секреты сборки мусора в Java (Алексей Рагозин)](https://reader036.fdocuments.in/reader036/viewer/2022062303/555e1c3fd8b42a6a4c8b463a/html5/thumbnails/30.jpg)
SATB write barrier (G1)
A B C D
GC A
C
![Page 31: Секреты сборки мусора в Java (Алексей Рагозин)](https://reader036.fdocuments.in/reader036/viewer/2022062303/555e1c3fd8b42a6a4c8b463a/html5/thumbnails/31.jpg)
SATB write barrier (G1)
A B C D
GC C
D
![Page 32: Секреты сборки мусора в Java (Алексей Рагозин)](https://reader036.fdocuments.in/reader036/viewer/2022062303/555e1c3fd8b42a6a4c8b463a/html5/thumbnails/32.jpg)
STAB write barrier (G1)
A B C D
GC C
D
Reference queue: B D
![Page 33: Секреты сборки мусора в Java (Алексей Рагозин)](https://reader036.fdocuments.in/reader036/viewer/2022062303/555e1c3fd8b42a6a4c8b463a/html5/thumbnails/33.jpg)
STAB write barrier (G1)
A B C D
GC C
D
![Page 34: Секреты сборки мусора в Java (Алексей Рагозин)](https://reader036.fdocuments.in/reader036/viewer/2022062303/555e1c3fd8b42a6a4c8b463a/html5/thumbnails/34.jpg)
SATB write barrier (G1)
A B C D
GC D
D
![Page 35: Секреты сборки мусора в Java (Алексей Рагозин)](https://reader036.fdocuments.in/reader036/viewer/2022062303/555e1c3fd8b42a6a4c8b463a/html5/thumbnails/35.jpg)
SATB write barrier (G1)
A B C D
GC
Reference queue: B D
![Page 36: Секреты сборки мусора в Java (Алексей Рагозин)](https://reader036.fdocuments.in/reader036/viewer/2022062303/555e1c3fd8b42a6a4c8b463a/html5/thumbnails/36.jpg)
SATB write barrier (G1)
A B C D
GC
Reference queue:
B
D
empty
![Page 37: Секреты сборки мусора в Java (Алексей Рагозин)](https://reader036.fdocuments.in/reader036/viewer/2022062303/555e1c3fd8b42a6a4c8b463a/html5/thumbnails/37.jpg)
Card marking write barrier [пауза] Сбор корневых ссылок [фон] Обход графа объектов [фон] Перемаркирова “грязных” страниц [паузa] Финальная перемаркирова
![Page 38: Секреты сборки мусора в Java (Алексей Рагозин)](https://reader036.fdocuments.in/reader036/viewer/2022062303/555e1c3fd8b42a6a4c8b463a/html5/thumbnails/38.jpg)
Перемещение объектовБольшинство JVM не могут перемещать объекты без STW паузы.
Цель – уменьшение длительности паузПараллельная обработка (задействовать все ядра)Инкрементальное уплотнение (чаще, но короче)Не уплотнять – опасность фрагментации
![Page 39: Секреты сборки мусора в Java (Алексей Рагозин)](https://reader036.fdocuments.in/reader036/viewer/2022062303/555e1c3fd8b42a6a4c8b463a/html5/thumbnails/39.jpg)
Oracle HotSpotDefault (serial) collector Young: Serial copy collector, Old: serial MSC
Parallel scavenge / Parallel old GC Young: Parallel copy collector, Old: serial MSC or parallel MSC
Concurrent mark sweep (CMS) Young: Serial or parallel copy collector, Old: concurrent mark sweep
G1 (garbage first) Young: Copy collector (region based) Old: Incremental MSC
http://aragozin.blogspot.com/2011/09/hotspot-jvm-garbage-collection-options.html
![Page 40: Секреты сборки мусора в Java (Алексей Рагозин)](https://reader036.fdocuments.in/reader036/viewer/2022062303/555e1c3fd8b42a6a4c8b463a/html5/thumbnails/40.jpg)
Oracle’s HotSpot JVMYoung collector Old collector JVM option Serial (DefNew) Serial Mark-Sweep-Compact -XX:+UseSerialGC
Parallel scavenge (PSYoungGen) Serial Mark-Sweep-Compact (PSOldGen) -XX:+UseParallelGC
Parallel scavenge (PSYoungGen) Parallel Mark-Sweep-Compact (ParOldGen) -XX:+UseParallelOldGC
Serial (DefNew) Concurrent Mark Sweep -XX:+UseConcMarkSweepGC -XX:-UseParNewGC
Parallel (ParNew) Concurrent Mark Sweep -XX:+UseConcMarkSweepGC -XX:+UseParNewGC
G1 -XX:+UseG1GC
http://aragozin.blogspot.com/2011/09/hotspot-jvm-garbage-collection-options.html
![Page 41: Секреты сборки мусора в Java (Алексей Рагозин)](https://reader036.fdocuments.in/reader036/viewer/2022062303/555e1c3fd8b42a6a4c8b463a/html5/thumbnails/41.jpg)
Oracle JRockit-Xgc: option Generational Mark Sweep/Compact
genconcon or gencon Yes concurrent incrementalsingleconcon or singlecon No concurrent incremental
genconpar Yes concurrent parallelsingleconpar No concurrent parallelgenparpar or genpar Yes parallel parallelsingleparpar or singlepar No parallel parallel
genparcon Yes parallel incrementalsingleparcon No parallel incremental
http://aragozin.blogspot.com/2011/07/jrockit-gc-in-action.html
![Page 42: Секреты сборки мусора в Java (Алексей Рагозин)](https://reader036.fdocuments.in/reader036/viewer/2022062303/555e1c3fd8b42a6a4c8b463a/html5/thumbnails/42.jpg)
IBM J9-Xgcpolicy:optthruput Одно поколение, stop-the-world сборщик
-Xgcpolicy:optavgpause Одно поколение, частично конкурентный сборщик
-Xgcpolicy:gencon Два поколения, частично конкурентный сборщик
![Page 43: Секреты сборки мусора в Java (Алексей Рагозин)](https://reader036.fdocuments.in/reader036/viewer/2022062303/555e1c3fd8b42a6a4c8b463a/html5/thumbnails/43.jpg)
Azul Zing• Два поколения• Молодое поколение – конкурентный mark-sweep-compact (MSC)• Старое поколение – конкурентный mark-sweep-compact (MSC)
Azul Zing выполняет перемещение объектов (уплотнение памяти) без останова приложения. Ни одна из фаз сборки мусора не требует STW паузы.
Секрет – read barrier.
![Page 44: Секреты сборки мусора в Java (Алексей Рагозин)](https://reader036.fdocuments.in/reader036/viewer/2022062303/555e1c3fd8b42a6a4c8b463a/html5/thumbnails/44.jpg)
Масштабируемость JVMМожет ли JVM работать с большим объёмом памяти (16GiB и более) без “фризов”?
Ответ да, если приложение удовлетворяет постулатам гипотезы о поколениях.
![Page 45: Секреты сборки мусора в Java (Алексей Рагозин)](https://reader036.fdocuments.in/reader036/viewer/2022062303/555e1c3fd8b42a6a4c8b463a/html5/thumbnails/45.jpg)
Рецепт работы без пауз• HotSpot JVM• CMS (Concurrent Mark Sweep) сборщик мусора• ТюнингРезультат• Паузы не более 150ms на 32GiB хипа
![Page 46: Секреты сборки мусора в Java (Алексей Рагозин)](https://reader036.fdocuments.in/reader036/viewer/2022062303/555e1c3fd8b42a6a4c8b463a/html5/thumbnails/46.jpg)
HotSpot CMS сборщик Сборка молодого поколения копированием Не перемещает объекты в старом поколении Статистические методы борьбы с фрагментацией Две дополнительные STW фазы
initial-mark, remark Вся остальная работа происходит в фоне
![Page 47: Секреты сборки мусора в Java (Алексей Рагозин)](https://reader036.fdocuments.in/reader036/viewer/2022062303/555e1c3fd8b42a6a4c8b463a/html5/thumbnails/47.jpg)
Длительность пауз CMS сборщика
![Page 48: Секреты сборки мусора в Java (Алексей Рагозин)](https://reader036.fdocuments.in/reader036/viewer/2022062303/555e1c3fd8b42a6a4c8b463a/html5/thumbnails/48.jpg)
Можно лучше – OpenJDK патч
http://aragozin.blogspot.com/2011/07/openjdk-patch-cutting-down-gc-pause.html
![Page 49: Секреты сборки мусора в Java (Алексей Рагозин)](https://reader036.fdocuments.in/reader036/viewer/2022062303/555e1c3fd8b42a6a4c8b463a/html5/thumbnails/49.jpg)
Сборка мусора в JVM Сборка мусора не чёрная магия Каждое приложение индивидуально Приложение не должно мешать сборщику мусора JVM может работать без пауз
(с паузами не более 100-200ms) Автоматическое управление памятью не
универсально(Проблемные приложения: HBase, Cassandra)
![Page 50: Секреты сборки мусора в Java (Алексей Рагозин)](https://reader036.fdocuments.in/reader036/viewer/2022062303/555e1c3fd8b42a6a4c8b463a/html5/thumbnails/50.jpg)
Альтернативыjava.nio.ByteBuffer.allocateDirect()Pro• Memory is allocated out of heap• Memory is deallocated when ByteBuffer is collected• Cross platform, native javaCon• Fragmentation of non-heap memory• Memory is deallocated when ByteBuffer is collected• Complicated multi thread programming• -XX:MaxDirectMemorySize=<value>
![Page 51: Секреты сборки мусора в Java (Алексей Рагозин)](https://reader036.fdocuments.in/reader036/viewer/2022062303/555e1c3fd8b42a6a4c8b463a/html5/thumbnails/51.jpg)
АльтернативыReal Time System JavaИерархия регионов памяти• Объекты выделяются в выбранном регионе• Локальные и “бессмертные” регионы не собираются• Локальные регионы освобождаются целиком• Глобальные объекты не могу ссылаться на локальные
![Page 52: Секреты сборки мусора в Java (Алексей Рагозин)](https://reader036.fdocuments.in/reader036/viewer/2022062303/555e1c3fd8b42a6a4c8b463a/html5/thumbnails/52.jpg)
АльтернативыUnsafe javasun.misc.Unsafe• Unsafe.allocateMemory(…)• Unsafe.reallocateMemory(…)• Unsafe.freeMemory(…)
![Page 53: Секреты сборки мусора в Java (Алексей Рагозин)](https://reader036.fdocuments.in/reader036/viewer/2022062303/555e1c3fd8b42a6a4c8b463a/html5/thumbnails/53.jpg)
Спасибо
Алексей Рагозин [email protected]
http://aragozin.blogspot.com- мои статьи о JVM и не только