SlideShare a Scribd company logo
Секреты сборки мусора в Java

                  Алексей Рагозин
             alexey.ragozin@gmail.com
О чём этот доклад?
• Обзор проблемы автоматического
  управления памятью
• Stop-the-world паузы – причины
• Сборка мусора в современных JVM
Сборка мусора
Языки использующие автоматическое управление памятью
 Java, JavaScript, Erlang, Haskell, Python, PHP, C#, Ruby, Perl,
SmallTalk, OCaml, List, Scala, ML, Go, D, …
 … and counting
Языки не использующие автоматическое управление
памятью
 C, C++, Pascal/Delphi, Objective-C
 Что я забыл?
Способы сборки мусора
Мусор – структура данных (объект) в памяти не
достижимый из программного кода.


   Подсчёт ссылок
   Транзитивное замыкание ссылок
   Вообще не собирать
Подсчёт ссылок
+   Просто
+   Не требует пауз для сбора мусора
–   Не очищает циклические графы
–   Дополнительные 15-30% нагрузки CPU
–   Плохо сочетается с много поточностью
Транзитивное замыкание
          ссылок
• Корневой набор ссылок
    Статические переменные
    Локальные переменные
• Объекты достижимые из корневых ссылок – живые
• Объекты недостижимые из корневых ссылок – мусор
В общем случае, граф объектов не должен меняться по мере обхода.
   Следовательно, прикладные потоки должны быть остановлены
   пока идёт сборка мусора.
Алгоритмы сборки мусора
• Mark-Sweep
   Фаза 1 – маркировка достижимых объектов
   Фаза 2 – “вычистка” мусора
• Copy collector (сборка копированием)
   Использует две области памяти, но выполняется в один проход
• Mark-Sweep-Compact
   Mark-Sweep + перемещение живых объектов
Трёх цветная маркировка

   roots
Трёх цветная маркировка

   roots
Трёх цветная маркировка

   roots
Трёх цветная маркировка

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

    roots




   FROM




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

    roots




   FROM




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

    roots




                 1
   FROM




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

    roots




                 1    2
   FROM




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

    roots




                 1    2
   FROM




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

    roots




                 3   1   2
   FROM




            TO
Экономика сборки мусора
 S – объём кучи                    Объём
 L – объём живых объектов       мусора в куче

 Copy collection
                       S−L
  Эффективность ≈ c ⋅
                         L
 Mark-Sweep
                        S−L        S−L
  Эффективность ≈ c1 ⋅     + c2 ⋅
                            L           S
Слабая гипотеза о поколениях

Постулаты
 Большинство объектов умирают молодыми
 Число ссылок на молодые объекты мало
Следствие
Если хранить молодые объекты отдельно от старых, можно
  обеспечить высокую пропускную способность (молодое
  поколение) и эффективное использование памяти (старое
  поколение).
Демография объектов в куче

                             Период молодой сборки

       Смертность (байт/с)

                                        Период старой сборки

                                                        ∞


                                 Возраст объектов
Generational collection
 Молодое поколение
    Сборщик настроен на пропускную способность
 Старое поколение
    Сборщик настроен на эффективное использование памяти
 Продвижение (promotion) объектов в старое поколение
    Сборщик молодого поколения копирует живые объекты в
     старое поколение после достижения “зрелого” возраста
Generational collection
Как получить все указатели из старого
поколения на молодое?
Ответ – барьер на запись
Каждый раз при записи указателя в память в
“старом” пространстве, срабатывает барьер
Молодая сборка HotSpot JVM

            Eden            S1    S2       Tenured



                                          Dirty cards
    Collect roots for young GC
       Scan stack traces
       Scan dirty pages in old space



                                 Сбор “корневых” ссылок
Молодая сборка HotSpot JVM
            Eden             S1     S2                     Tenured




                                                          Dirty cards
    Collect roots for young GC
       Clean cards
       Recursive copy of live objects (only live objects are traversed)



                       Копирование живых объектов
Молодая сборка HotSpot JVM

         Eden      S1   S2         Tenured



                                  Dirty cards


  Области памяти, не помеченные в таблице карт,
  не могут содержать ссылки на молодое поколение
                              Сборка закончена
Stop-the-world паузы
• Изменение графа объектов во время
  обхода может привести к пропуску
  достижимых объектов
• Большинство managed runtimes может
  перемещать объекты только в режиме
  паузы
Stop-the-world паузы
Параллельные (parallel) алгоритмы
 Используют несколько потоков чтобы сократить время пауз

Фоновые (concurrent) алгоритмы
 Выполняют большую часть работы в фоновом режиме (без STW пауз)

Инкрементальные алгоритмы
 Много маленьких STW вместо одной длительной
Фоновая маркировка
Проблема
 Граф объектов меняется по мере обхода *
* Даже в функциональных языках могут выполняться
отложенные вычисления, меняющие граф
Решение
 барьер на запись – отслеживать ссылки
изменившиеся за время обхода
Фоновая маркировка
 Card marking write barrier
    HotSpot CMS, JRockit, IBM J9
 Snapshot-at-the-beginning (SATB) write barrier
    HotSpot G1
 Альтернатива барьеру на запись – барьер на
  чтение
    Azul Zing JVM
SATB барьер записи (G1)

          C
       GC A




        A     B   C       D
SATB барьер записи (G1)

          D
       GC C




        A     B   C       D
SATB барьер записи (G1)

          D
       GC C




        A     B       C         D




                  Очередь ссылок: B D
                   Reference queue:
SATB барьер записи (G1)

                     D
                  GC C



        A    B    C       D
SATB барьер записи (G1)

                     D
                  GC D



        A    B    C       D
SATB барьер записи (G1)

                               GC



        A    B        C            D




             Очередь ссылок: B D
              Reference queue:
SATB барьер записи (G1)

                D
             GC B



        A    B             C           D




                 Reference ссылок: пусто
                  Очередь queue: empty
“Card marking” барьер записи
    [пауза]   Сбор корневых ссылок
    [фон]     Обход графа объектов
    [фон]     Перемаркирова “грязных” страниц
    [паузa]   Финальная перемаркирова
Перемещение объектов
Большинство JVM не может перемещать объекты
без STW паузы.
Цель – уменьшение длительности пауз
Параллельная обработка (задействовать все ядра)
Инкрементальное уплотнение (чаще, но короче)
Не уплотнять – опасность фрагментации
Oracle HotSpot
Однопоточный сборщик мусора
-XX:+UseSerialGC
Молодое поколение:
• Сборка копированием
Старое поколение:
• Mark Sweep Compact
Возвращает неиспользуемую
  память ОС после сборки старшего поколения

   http://aragozin.blogspot.com/2011/09/hotspot-jvm-garbage-collection-options.html
Oracle HotSpot
Параллельный сборщик мусора
-XX:+UseParallelGC –XX:+UseParallelOldGC
Молодое поколение:
• Многопоточная сборка копированием
Старое поколение:
• Многопоточный Mark Sweep Compact



  http://aragozin.blogspot.com/2011/09/hotspot-jvm-garbage-collection-options.html
Oracle HotSpot
Фоновый сборщик мусора
-XX:+UseConcMarkSweepGC
Молодое поколение:
• Одно или многопоточная сборка копированием
Старое поколение:
• Фоновая Mark Sweep сборка
Не перемещает объекты в старом поколении при сборке в
  фоновом режиме

   http://aragozin.blogspot.com/2011/09/hotspot-jvm-garbage-collection-options.html
Oracle HotSpot
Фоновый сборщик мусора
-XX:+UseG1GC
Молодое поколение:
• Многопоточная сборка копированием
Старое поколение:
• Инкрементальная многопоточная сборка копированием
Возвращает не используемую память ОС


   http://aragozin.blogspot.com/2011/09/hotspot-jvm-garbage-collection-options.html
Oracle’s HotSpot JVM

Young 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://blog.ragozin.info/2011/09/hotspot-jvm-garbage-collection-options.html
Oracle JRockit
-Xgc: option                 Generational         Mark        Sweep/Compact
genconcon or gencon         Yes               concurrent     incremental
singleconcon or singlecon   No                concurrent     incremental
genconpar                   Yes               concurrent     parallel
singleconpar                No                concurrent     parallel
genparpar or genpar         Yes               parallel       parallel
singleparpar or singlepar   No                parallel       parallel
genparcon                   Yes               parallel       incremental
singleparcon                No                parallel       incremental
                       http://blog.ragozin.info/2011/07/jrockit-gc-in-action.html
IBM J9
-Xgcpolicy:optthruput
 Одно поколение, stop-the-world сборщик

-Xgcpolicy:optavgpause
 Одно поколение, частично конкурентный сборщик

-Xgcpolicy:gencon
 Два поколения, частично конкурентный сборщик
Azul Zing
• Два поколения
• Молодое поколение – конкурентный mark-sweep-compact
  (MSC)
• Старое поколение – конкурентный mark-sweep-compact
  (MSC)
Azul Zing выполняет перемещение объектов (уплотнение
  памяти) без останова приложения. Ни одна из фаз сборки
  мусора не требует STW паузы.
Секрет – read barrier (барьер чтения).
Масштабируемость JVM
Может ли JVM работать с большим объёмом
памяти (16GiB и более) без “фризов”?

Ответ да, если приложение удовлетворяет
постулатам гипотезы о поколениях.
Рецепт работы без пауз
• HotSpot JVM
• CMS (Concurrent Mark Sweep) сборщик
  мусора
• Тюнинг
Результат
• Паузы не более 150ms на 32GiB кучи
HotSpot CMS сборщик
   Сборка молодого поколения копированием
   Не перемещает объекты в старом поколении
   Статистические методы борьбы с фрагментацией
   Две дополнительные STW фазы
     initial-mark, remark
 Вся остальная работа происходит в фоне
Длительность пауз CMS
      сборщика
CMS и фрагментация памяти
 CMS не перемещает объекты в старшем поколении.
 CMS использует отдельные списки свободного места (FSL)
 для каждого размера выделяемого блока.

 Профилактика фрагментации:
 • увеличение размера кучи
 • более частые циклы сборки
 • HotSpot JVM версии 6u26 и старше
Советы по настройке CMS
Настройка CMS на большом объёме кучи
•   -XX:MaxNewSize= ? – размер молодого поколения
•   -XX:CMSWaitDuration= ?
•   -XX:-CMSConcurrentMTEnabled – защита от бага в JVM
•   -XX:+UseCMSInitiatingOccupancyOnly
•   -XX:+CMSClassUnloadingEnabled – если действительно нужно
•   -XX:ParGCCardsPerStrideChunk= ? – если куча больше 16 GiB
•   JVM 1.6u26 или более поздняя
•   плюс логирование GC
Другие причины пауз
•   Свопинг ОС
•   Обработка ссылок (weak, soft, phantom, JNI)
•   Объекты требующие “финализации”
•   JNI, native код может блокировать GC
•   Проблемы с permanent generation
HotSpot G1
G1 (Garbage First) – новый алгоритм в
последних версия HotSpot JVM


     Решит ли он проблему пауз?
Можно лучше – OpenJDK патч
                                          RFE-7068625




    http://blog.ragozin.info/2011/07/openjdk-patch-cutting-down-gc-pause.html
ИТОГ: Сборка мусора в JVM
 Сборка мусора не чёрная магия
 Каждое приложение индивидуально
 Приложение не должно мешать сборщику
  мусора
 JVM может работать “почти” без пауз
  (с паузами не более 100-200ms)
 Автоматическое управление памятью не
  универсально
  (Проблемные приложения: HBase, Cassandra, …)
Альтернативы
java.nio.ByteBuffer.allocateDirect()
Достоиства
•   Память выделяется вне кучи
•   Память освобождается автоматически (через ByteBuffer объект)
•   Кроссплатформенность, “чистая Java”
Недостатки
•   Фрагментация памяти вне кучи
•   Память освобождается автоматически (через ByteBuffer объект)
•   Усложняет многопоточное программирование
•   -XX:MaxDirectMemorySize=<value>
Альтернативы
Real Time System Java
Иерархия регионов памяти
• Объекты выделяются в выбранном регионе
• Локальные и “бессмертные” регионы не собираются
• Локальные регионы освобождаются целиком
• Глобальные объекты не могу ссылаться на локальные
Альтернативы
Unsafe Java™
sun.misc.Unsafe
• Unsafe.allocateMemory(…)
• Unsafe.reallocateMemory(…)
• Unsafe.freeMemory(…)
Спасибо
http://blog.ragozin.info
- мои статьи о JVM и не только
                                    Алексей Рагозин
                           alexey.ragozin@gmail.com

More Related Content

Viewers also liked (7)

Powerpoint tic
Powerpoint ticPowerpoint tic
Powerpoint tic
Esther Maganto
 
инструкция по заполнению бланков №1 физика
инструкция по заполнению бланков №1   физикаинструкция по заполнению бланков №1   физика
инструкция по заполнению бланков №1 физика
123367vova
 
Ponderosa VFD Newsletter Winter 2011
Ponderosa VFD Newsletter Winter 2011Ponderosa VFD Newsletter Winter 2011
Ponderosa VFD Newsletter Winter 2011
The Texas Network, LLC
 
Powerpoint first one of many to come
Powerpoint first one of many to comePowerpoint first one of many to come
Powerpoint first one of many to come
nikkiis18
 
Presentation prus
Presentation prusPresentation prus
Presentation prus
César Sobrino
 
123
123123
123
kalpana2910
 
инструкция по заполнению бланков №1 физика
инструкция по заполнению бланков №1   физикаинструкция по заполнению бланков №1   физика
инструкция по заполнению бланков №1 физика
123367vova
 
Powerpoint first one of many to come
Powerpoint first one of many to comePowerpoint first one of many to come
Powerpoint first one of many to come
nikkiis18
 

Similar to DUMP-2012 - Только хардкор! - "Секреты сборки мусора в Java" Алексей Рагозин (20)

Борьба с GС паузами в JVM
Борьба с GС паузами в JVMБорьба с GС паузами в JVM
Борьба с GС паузами в JVM
aragozin
 
20100307 virtualization igotti_lecture04
20100307 virtualization igotti_lecture0420100307 virtualization igotti_lecture04
20100307 virtualization igotti_lecture04
Computer Science Club
 
"G1 GC и Обзор сборки мусора в HotSpot JVM" @ JUG SPb, 31-05-2012
"G1 GC и Обзор сборки мусора в HotSpot JVM" @ JUG SPb, 31-05-2012"G1 GC и Обзор сборки мусора в HotSpot JVM" @ JUG SPb, 31-05-2012
"G1 GC и Обзор сборки мусора в HotSpot JVM" @ JUG SPb, 31-05-2012
Vladimir Ivanov
 
High Load
High LoadHigh Load
High Load
alexeymaykov
 
Garbage collection in V8 VM
Garbage collection in V8 VMGarbage collection in V8 VM
Garbage collection in V8 VM
Alexander Syrotenko
 
Алексей Рагозин
Алексей РагозинАлексей Рагозин
Алексей Рагозин
Ontico
 
MyRocks: табличный движок для MySQL на основе RocksDB
MyRocks: табличный движок для MySQL на основе RocksDBMyRocks: табличный движок для MySQL на основе RocksDB
MyRocks: табличный движок для MySQL на основе RocksDB
Sergey Petrunya
 
MyRocks Табличный Движок для MySQL / Алексей Майков (Facebook) / Сергей Петру...
MyRocks Табличный Движок для MySQL / Алексей Майков (Facebook) / Сергей Петру...MyRocks Табличный Движок для MySQL / Алексей Майков (Facebook) / Сергей Петру...
MyRocks Табличный Движок для MySQL / Алексей Майков (Facebook) / Сергей Петру...
Ontico
 
Управление памятью в CPython
Управление памятью в CPythonУправление памятью в CPython
Управление памятью в CPython
Anton Patrushev
 
Современная операционная система: что надо знать разработчику / Александр Кри...
Современная операционная система: что надо знать разработчику / Александр Кри...Современная операционная система: что надо знать разработчику / Александр Кри...
Современная операционная система: что надо знать разработчику / Александр Кри...
Ontico
 
Unsafe: to be or to be removed?
Unsafe: to be or to be removed?Unsafe: to be or to be removed?
Unsafe: to be or to be removed?
Alexey Fyodorov
 
Внутреннее устройство PostgreSQL: временные таблицы и фрагментация памяти / Г...
Внутреннее устройство PostgreSQL: временные таблицы и фрагментация памяти / Г...Внутреннее устройство PostgreSQL: временные таблицы и фрагментация памяти / Г...
Внутреннее устройство PostgreSQL: временные таблицы и фрагментация памяти / Г...
Ontico
 
New Android NDK & JNI
New Android NDK & JNINew Android NDK & JNI
New Android NDK & JNI
Stfalcon Meetups
 
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
Alexey Paznikov
 
Внедрение параллельного рендеринга в игровой движок
Внедрение параллельного рендеринга в игровой движокВнедрение параллельного рендеринга в игровой движок
Внедрение параллельного рендеринга в игровой движок
Roman_Lut
 
How to cook a blockchain and not get burned
How to cook a blockchain and not get burned How to cook a blockchain and not get burned
How to cook a blockchain and not get burned
Alexander Syrotenko
 
In the sun.misc.Unsafe bowels
In the sun.misc.Unsafe bowelsIn the sun.misc.Unsafe bowels
In the sun.misc.Unsafe bowels
Alexander Efremenkov
 
Совместное применение графов де Брёйна, графов перекрытий и микросборки для d...
Совместное применение графов де Брёйна, графов перекрытий и микросборки для d...Совместное применение графов де Брёйна, графов перекрытий и микросборки для d...
Совместное применение графов де Брёйна, графов перекрытий и микросборки для d...
Anton Alexandrov
 
Эффективное использование x86-совместимых CPU (Алексей Тутубалин)
Эффективное использование x86-совместимых CPU (Алексей Тутубалин)Эффективное использование x86-совместимых CPU (Алексей Тутубалин)
Эффективное использование x86-совместимых CPU (Алексей Тутубалин)
Ontico
 
Scala performance под капотом
Scala performance под капотомScala performance под капотом
Scala performance под капотом
Roman Grebennikov
 
Борьба с GС паузами в JVM
Борьба с GС паузами в JVMБорьба с GС паузами в JVM
Борьба с GС паузами в JVM
aragozin
 
20100307 virtualization igotti_lecture04
20100307 virtualization igotti_lecture0420100307 virtualization igotti_lecture04
20100307 virtualization igotti_lecture04
Computer Science Club
 
"G1 GC и Обзор сборки мусора в HotSpot JVM" @ JUG SPb, 31-05-2012
"G1 GC и Обзор сборки мусора в HotSpot JVM" @ JUG SPb, 31-05-2012"G1 GC и Обзор сборки мусора в HotSpot JVM" @ JUG SPb, 31-05-2012
"G1 GC и Обзор сборки мусора в HotSpot JVM" @ JUG SPb, 31-05-2012
Vladimir Ivanov
 
Алексей Рагозин
Алексей РагозинАлексей Рагозин
Алексей Рагозин
Ontico
 
MyRocks: табличный движок для MySQL на основе RocksDB
MyRocks: табличный движок для MySQL на основе RocksDBMyRocks: табличный движок для MySQL на основе RocksDB
MyRocks: табличный движок для MySQL на основе RocksDB
Sergey Petrunya
 
MyRocks Табличный Движок для MySQL / Алексей Майков (Facebook) / Сергей Петру...
MyRocks Табличный Движок для MySQL / Алексей Майков (Facebook) / Сергей Петру...MyRocks Табличный Движок для MySQL / Алексей Майков (Facebook) / Сергей Петру...
MyRocks Табличный Движок для MySQL / Алексей Майков (Facebook) / Сергей Петру...
Ontico
 
Управление памятью в CPython
Управление памятью в CPythonУправление памятью в CPython
Управление памятью в CPython
Anton Patrushev
 
Современная операционная система: что надо знать разработчику / Александр Кри...
Современная операционная система: что надо знать разработчику / Александр Кри...Современная операционная система: что надо знать разработчику / Александр Кри...
Современная операционная система: что надо знать разработчику / Александр Кри...
Ontico
 
Unsafe: to be or to be removed?
Unsafe: to be or to be removed?Unsafe: to be or to be removed?
Unsafe: to be or to be removed?
Alexey Fyodorov
 
Внутреннее устройство PostgreSQL: временные таблицы и фрагментация памяти / Г...
Внутреннее устройство PostgreSQL: временные таблицы и фрагментация памяти / Г...Внутреннее устройство PostgreSQL: временные таблицы и фрагментация памяти / Г...
Внутреннее устройство PostgreSQL: временные таблицы и фрагментация памяти / Г...
Ontico
 
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
Alexey Paznikov
 
Внедрение параллельного рендеринга в игровой движок
Внедрение параллельного рендеринга в игровой движокВнедрение параллельного рендеринга в игровой движок
Внедрение параллельного рендеринга в игровой движок
Roman_Lut
 
How to cook a blockchain and not get burned
How to cook a blockchain and not get burned How to cook a blockchain and not get burned
How to cook a blockchain and not get burned
Alexander Syrotenko
 
Совместное применение графов де Брёйна, графов перекрытий и микросборки для d...
Совместное применение графов де Брёйна, графов перекрытий и микросборки для d...Совместное применение графов де Брёйна, графов перекрытий и микросборки для d...
Совместное применение графов де Брёйна, графов перекрытий и микросборки для d...
Anton Alexandrov
 
Эффективное использование x86-совместимых CPU (Алексей Тутубалин)
Эффективное использование x86-совместимых CPU (Алексей Тутубалин)Эффективное использование x86-совместимых CPU (Алексей Тутубалин)
Эффективное использование x86-совместимых CPU (Алексей Тутубалин)
Ontico
 
Scala performance под капотом
Scala performance под капотомScala performance под капотом
Scala performance под капотом
Roman Grebennikov
 

More from it-people (20)

«Про аналитику и серебряные пули» Александр Подсобляев, Rambler&Co
«Про аналитику и серебряные пули» Александр Подсобляев, Rambler&Co«Про аналитику и серебряные пули» Александр Подсобляев, Rambler&Co
«Про аналитику и серебряные пули» Александр Подсобляев, Rambler&Co
it-people
 
«Scrapy internals» Александр Сибиряков, Scrapinghub
«Scrapy internals» Александр Сибиряков, Scrapinghub«Scrapy internals» Александр Сибиряков, Scrapinghub
«Scrapy internals» Александр Сибиряков, Scrapinghub
it-people
 
«Отладка в Python 3.6: Быстрее, Выше, Сильнее» Елизавета Шашкова, JetBrains
«Отладка в Python 3.6: Быстрее, Выше, Сильнее» Елизавета Шашкова, JetBrains«Отладка в Python 3.6: Быстрее, Выше, Сильнее» Елизавета Шашкова, JetBrains
«Отладка в Python 3.6: Быстрее, Выше, Сильнее» Елизавета Шашкова, JetBrains
it-people
 
«Gevent — быть или не быть?» Александр Мокров, Positive Technologies
«Gevent — быть или не быть?» Александр Мокров, Positive Technologies«Gevent — быть или не быть?» Александр Мокров, Positive Technologies
«Gevent — быть или не быть?» Александр Мокров, Positive Technologies
it-people
 
«Ещё один Поиск Яндекса» Александр Кошелев, Яндекс
«Ещё один Поиск Яндекса» Александр Кошелев, Яндекс«Ещё один Поиск Яндекса» Александр Кошелев, Яндекс
«Ещё один Поиск Яндекса» Александр Кошелев, Яндекс
it-people
 
«How I Learned to Stop Worrying and Love the BFG: нагрузочное тестирование со...
«How I Learned to Stop Worrying and Love the BFG: нагрузочное тестирование со...«How I Learned to Stop Worrying and Love the BFG: нагрузочное тестирование со...
«How I Learned to Stop Worrying and Love the BFG: нагрузочное тестирование со...
it-people
 
«Write once run anywhere — почём опиум для народа?» Игорь Новиков, Scalr
«Write once run anywhere — почём опиум для народа?» Игорь Новиков, Scalr«Write once run anywhere — почём опиум для народа?» Игорь Новиков, Scalr
«Write once run anywhere — почём опиум для народа?» Игорь Новиков, Scalr
it-people
 
«Gensim — тематическое моделирование для людей» Иван Меньших, Лев Константино...
«Gensim — тематическое моделирование для людей» Иван Меньших, Лев Константино...«Gensim — тематическое моделирование для людей» Иван Меньших, Лев Константино...
«Gensim — тематическое моделирование для людей» Иван Меньших, Лев Константино...
it-people
 
«Тотальный контроль производительности» Михаил Юматов, ЦИАН
«Тотальный контроль производительности» Михаил Юматов, ЦИАН«Тотальный контроль производительности» Михаил Юматов, ЦИАН
«Тотальный контроль производительности» Михаил Юматов, ЦИАН
it-people
 
«Детские болезни live-чата» Ольга Сентемова, Тинькофф Банк
«Детские болезни live-чата» Ольга Сентемова, Тинькофф Банк«Детские болезни live-чата» Ольга Сентемова, Тинькофф Банк
«Детские болезни live-чата» Ольга Сентемова, Тинькофф Банк
it-people
 
«Микросервисы наносят ответный удар!» Олег Чуркин, Rambler&Co
«Микросервисы наносят ответный удар!» Олег Чуркин, Rambler&Co«Микросервисы наносят ответный удар!» Олег Чуркин, Rambler&Co
«Микросервисы наносят ответный удар!» Олег Чуркин, Rambler&Co
it-people
 
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
it-people
 
«Что такое serverless-архитектура и как с ней жить?» Николай Марков, Aligned ...
«Что такое serverless-архитектура и как с ней жить?» Николай Марков, Aligned ...«Что такое serverless-архитектура и как с ней жить?» Николай Марков, Aligned ...
«Что такое serverless-архитектура и как с ней жить?» Николай Марков, Aligned ...
it-people
 
«Python на острие бритвы: PyPy project» Александр Кошкин, Positive Technologies
«Python на острие бритвы: PyPy project» Александр Кошкин, Positive Technologies«Python на острие бритвы: PyPy project» Александр Кошкин, Positive Technologies
«Python на острие бритвы: PyPy project» Александр Кошкин, Positive Technologies
it-people
 
«PyWat. А хорошо ли вы знаете Python?» Александр Швец, Marilyn System
«PyWat. А хорошо ли вы знаете Python?» Александр Швец, Marilyn System«PyWat. А хорошо ли вы знаете Python?» Александр Швец, Marilyn System
«PyWat. А хорошо ли вы знаете Python?» Александр Швец, Marilyn System
it-people
 
«(Без)опасный Python», Иван Цыганов, Positive Technologies
«(Без)опасный Python», Иван Цыганов, Positive Technologies«(Без)опасный Python», Иван Цыганов, Positive Technologies
«(Без)опасный Python», Иван Цыганов, Positive Technologies
it-people
 
«Python of Things», Кирилл Борисов, Яндекс
«Python of Things», Кирилл Борисов, Яндекс«Python of Things», Кирилл Борисов, Яндекс
«Python of Things», Кирилл Борисов, Яндекс
it-people
 
«Как сделать так, чтобы тесты на Swift не причиняли боль» Сычев Александр, Ra...
«Как сделать так, чтобы тесты на Swift не причиняли боль» Сычев Александр, Ra...«Как сделать так, чтобы тесты на Swift не причиняли боль» Сычев Александр, Ra...
«Как сделать так, чтобы тесты на Swift не причиняли боль» Сычев Александр, Ra...
it-people
 
«Клиенту и серверу нужно поговорить» Прокопов Никита, Cognician
«Клиенту и серверу нужно поговорить» Прокопов Никита, Cognician«Клиенту и серверу нужно поговорить» Прокопов Никита, Cognician
«Клиенту и серверу нужно поговорить» Прокопов Никита, Cognician
it-people
 
«Кошелек или деньги: сложный выбор между памятью и процессором» Алексеенко Иг...
«Кошелек или деньги: сложный выбор между памятью и процессором» Алексеенко Иг...«Кошелек или деньги: сложный выбор между памятью и процессором» Алексеенко Иг...
«Кошелек или деньги: сложный выбор между памятью и процессором» Алексеенко Иг...
it-people
 
«Про аналитику и серебряные пули» Александр Подсобляев, Rambler&Co
«Про аналитику и серебряные пули» Александр Подсобляев, Rambler&Co«Про аналитику и серебряные пули» Александр Подсобляев, Rambler&Co
«Про аналитику и серебряные пули» Александр Подсобляев, Rambler&Co
it-people
 
«Scrapy internals» Александр Сибиряков, Scrapinghub
«Scrapy internals» Александр Сибиряков, Scrapinghub«Scrapy internals» Александр Сибиряков, Scrapinghub
«Scrapy internals» Александр Сибиряков, Scrapinghub
it-people
 
«Отладка в Python 3.6: Быстрее, Выше, Сильнее» Елизавета Шашкова, JetBrains
«Отладка в Python 3.6: Быстрее, Выше, Сильнее» Елизавета Шашкова, JetBrains«Отладка в Python 3.6: Быстрее, Выше, Сильнее» Елизавета Шашкова, JetBrains
«Отладка в Python 3.6: Быстрее, Выше, Сильнее» Елизавета Шашкова, JetBrains
it-people
 
«Gevent — быть или не быть?» Александр Мокров, Positive Technologies
«Gevent — быть или не быть?» Александр Мокров, Positive Technologies«Gevent — быть или не быть?» Александр Мокров, Positive Technologies
«Gevent — быть или не быть?» Александр Мокров, Positive Technologies
it-people
 
«Ещё один Поиск Яндекса» Александр Кошелев, Яндекс
«Ещё один Поиск Яндекса» Александр Кошелев, Яндекс«Ещё один Поиск Яндекса» Александр Кошелев, Яндекс
«Ещё один Поиск Яндекса» Александр Кошелев, Яндекс
it-people
 
«How I Learned to Stop Worrying and Love the BFG: нагрузочное тестирование со...
«How I Learned to Stop Worrying and Love the BFG: нагрузочное тестирование со...«How I Learned to Stop Worrying and Love the BFG: нагрузочное тестирование со...
«How I Learned to Stop Worrying and Love the BFG: нагрузочное тестирование со...
it-people
 
«Write once run anywhere — почём опиум для народа?» Игорь Новиков, Scalr
«Write once run anywhere — почём опиум для народа?» Игорь Новиков, Scalr«Write once run anywhere — почём опиум для народа?» Игорь Новиков, Scalr
«Write once run anywhere — почём опиум для народа?» Игорь Новиков, Scalr
it-people
 
«Gensim — тематическое моделирование для людей» Иван Меньших, Лев Константино...
«Gensim — тематическое моделирование для людей» Иван Меньших, Лев Константино...«Gensim — тематическое моделирование для людей» Иван Меньших, Лев Константино...
«Gensim — тематическое моделирование для людей» Иван Меньших, Лев Константино...
it-people
 
«Тотальный контроль производительности» Михаил Юматов, ЦИАН
«Тотальный контроль производительности» Михаил Юматов, ЦИАН«Тотальный контроль производительности» Михаил Юматов, ЦИАН
«Тотальный контроль производительности» Михаил Юматов, ЦИАН
it-people
 
«Детские болезни live-чата» Ольга Сентемова, Тинькофф Банк
«Детские болезни live-чата» Ольга Сентемова, Тинькофф Банк«Детские болезни live-чата» Ольга Сентемова, Тинькофф Банк
«Детские болезни live-чата» Ольга Сентемова, Тинькофф Банк
it-people
 
«Микросервисы наносят ответный удар!» Олег Чуркин, Rambler&Co
«Микросервисы наносят ответный удар!» Олег Чуркин, Rambler&Co«Микросервисы наносят ответный удар!» Олег Чуркин, Rambler&Co
«Микросервисы наносят ответный удар!» Олег Чуркин, Rambler&Co
it-people
 
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
it-people
 
«Что такое serverless-архитектура и как с ней жить?» Николай Марков, Aligned ...
«Что такое serverless-архитектура и как с ней жить?» Николай Марков, Aligned ...«Что такое serverless-архитектура и как с ней жить?» Николай Марков, Aligned ...
«Что такое serverless-архитектура и как с ней жить?» Николай Марков, Aligned ...
it-people
 
«Python на острие бритвы: PyPy project» Александр Кошкин, Positive Technologies
«Python на острие бритвы: PyPy project» Александр Кошкин, Positive Technologies«Python на острие бритвы: PyPy project» Александр Кошкин, Positive Technologies
«Python на острие бритвы: PyPy project» Александр Кошкин, Positive Technologies
it-people
 
«PyWat. А хорошо ли вы знаете Python?» Александр Швец, Marilyn System
«PyWat. А хорошо ли вы знаете Python?» Александр Швец, Marilyn System«PyWat. А хорошо ли вы знаете Python?» Александр Швец, Marilyn System
«PyWat. А хорошо ли вы знаете Python?» Александр Швец, Marilyn System
it-people
 
«(Без)опасный Python», Иван Цыганов, Positive Technologies
«(Без)опасный Python», Иван Цыганов, Positive Technologies«(Без)опасный Python», Иван Цыганов, Positive Technologies
«(Без)опасный Python», Иван Цыганов, Positive Technologies
it-people
 
«Python of Things», Кирилл Борисов, Яндекс
«Python of Things», Кирилл Борисов, Яндекс«Python of Things», Кирилл Борисов, Яндекс
«Python of Things», Кирилл Борисов, Яндекс
it-people
 
«Как сделать так, чтобы тесты на Swift не причиняли боль» Сычев Александр, Ra...
«Как сделать так, чтобы тесты на Swift не причиняли боль» Сычев Александр, Ra...«Как сделать так, чтобы тесты на Swift не причиняли боль» Сычев Александр, Ra...
«Как сделать так, чтобы тесты на Swift не причиняли боль» Сычев Александр, Ra...
it-people
 
«Клиенту и серверу нужно поговорить» Прокопов Никита, Cognician
«Клиенту и серверу нужно поговорить» Прокопов Никита, Cognician«Клиенту и серверу нужно поговорить» Прокопов Никита, Cognician
«Клиенту и серверу нужно поговорить» Прокопов Никита, Cognician
it-people
 
«Кошелек или деньги: сложный выбор между памятью и процессором» Алексеенко Иг...
«Кошелек или деньги: сложный выбор между памятью и процессором» Алексеенко Иг...«Кошелек или деньги: сложный выбор между памятью и процессором» Алексеенко Иг...
«Кошелек или деньги: сложный выбор между памятью и процессором» Алексеенко Иг...
it-people
 

DUMP-2012 - Только хардкор! - "Секреты сборки мусора в Java" Алексей Рагозин

  • 1. Секреты сборки мусора в Java Алексей Рагозин [email protected]
  • 2. О чём этот доклад? • Обзор проблемы автоматического управления памятью • Stop-the-world паузы – причины • Сборка мусора в современных JVM
  • 3. Сборка мусора Языки использующие автоматическое управление памятью  Java, JavaScript, Erlang, Haskell, Python, PHP, C#, Ruby, Perl, SmallTalk, OCaml, List, Scala, ML, Go, D, …  … and counting Языки не использующие автоматическое управление памятью  C, C++, Pascal/Delphi, Objective-C  Что я забыл?
  • 4. Способы сборки мусора Мусор – структура данных (объект) в памяти не достижимый из программного кода. Подсчёт ссылок Транзитивное замыкание ссылок Вообще не собирать
  • 5. Подсчёт ссылок + Просто + Не требует пауз для сбора мусора – Не очищает циклические графы – Дополнительные 15-30% нагрузки CPU – Плохо сочетается с много поточностью
  • 6. Транзитивное замыкание ссылок • Корневой набор ссылок  Статические переменные  Локальные переменные • Объекты достижимые из корневых ссылок – живые • Объекты недостижимые из корневых ссылок – мусор В общем случае, граф объектов не должен меняться по мере обхода. Следовательно, прикладные потоки должны быть остановлены пока идёт сборка мусора.
  • 7. Алгоритмы сборки мусора • Mark-Sweep  Фаза 1 – маркировка достижимых объектов  Фаза 2 – “вычистка” мусора • Copy collector (сборка копированием)  Использует две области памяти, но выполняется в один проход • Mark-Sweep-Compact  Mark-Sweep + перемещение живых объектов
  • 18. Экономика сборки мусора S – объём кучи Объём L – объём живых объектов мусора в куче Copy collection S−L  Эффективность ≈ c ⋅ L Mark-Sweep S−L S−L  Эффективность ≈ c1 ⋅ + c2 ⋅ L S
  • 19. Слабая гипотеза о поколениях Постулаты  Большинство объектов умирают молодыми  Число ссылок на молодые объекты мало Следствие Если хранить молодые объекты отдельно от старых, можно обеспечить высокую пропускную способность (молодое поколение) и эффективное использование памяти (старое поколение).
  • 20. Демография объектов в куче Период молодой сборки Смертность (байт/с) Период старой сборки ∞ Возраст объектов
  • 21. Generational collection  Молодое поколение  Сборщик настроен на пропускную способность  Старое поколение  Сборщик настроен на эффективное использование памяти  Продвижение (promotion) объектов в старое поколение  Сборщик молодого поколения копирует живые объекты в старое поколение после достижения “зрелого” возраста
  • 22. Generational collection Как получить все указатели из старого поколения на молодое? Ответ – барьер на запись Каждый раз при записи указателя в память в “старом” пространстве, срабатывает барьер
  • 23. Молодая сборка HotSpot JVM Eden S1 S2 Tenured Dirty cards Collect roots for young GC Scan stack traces Scan dirty pages in old space Сбор “корневых” ссылок
  • 24. Молодая сборка HotSpot JVM Eden S1 S2 Tenured Dirty cards Collect roots for young GC Clean cards Recursive copy of live objects (only live objects are traversed) Копирование живых объектов
  • 25. Молодая сборка HotSpot JVM Eden S1 S2 Tenured Dirty cards Области памяти, не помеченные в таблице карт, не могут содержать ссылки на молодое поколение Сборка закончена
  • 26. Stop-the-world паузы • Изменение графа объектов во время обхода может привести к пропуску достижимых объектов • Большинство managed runtimes может перемещать объекты только в режиме паузы
  • 27. Stop-the-world паузы Параллельные (parallel) алгоритмы  Используют несколько потоков чтобы сократить время пауз Фоновые (concurrent) алгоритмы  Выполняют большую часть работы в фоновом режиме (без STW пауз) Инкрементальные алгоритмы  Много маленьких STW вместо одной длительной
  • 28. Фоновая маркировка Проблема  Граф объектов меняется по мере обхода * * Даже в функциональных языках могут выполняться отложенные вычисления, меняющие граф Решение  барьер на запись – отслеживать ссылки изменившиеся за время обхода
  • 29. Фоновая маркировка  Card marking write barrier  HotSpot CMS, JRockit, IBM J9  Snapshot-at-the-beginning (SATB) write barrier  HotSpot G1  Альтернатива барьеру на запись – барьер на чтение  Azul Zing JVM
  • 30. SATB барьер записи (G1) C GC A A B C D
  • 31. SATB барьер записи (G1) D GC C A B C D
  • 32. SATB барьер записи (G1) D GC C A B C D Очередь ссылок: B D Reference queue:
  • 33. SATB барьер записи (G1) D GC C A B C D
  • 34. SATB барьер записи (G1) D GC D A B C D
  • 35. SATB барьер записи (G1) GC A B C D Очередь ссылок: B D Reference queue:
  • 36. SATB барьер записи (G1) D GC B A B C D Reference ссылок: пусто Очередь queue: empty
  • 37. “Card marking” барьер записи  [пауза] Сбор корневых ссылок  [фон] Обход графа объектов  [фон] Перемаркирова “грязных” страниц  [паузa] Финальная перемаркирова
  • 38. Перемещение объектов Большинство JVM не может перемещать объекты без STW паузы. Цель – уменьшение длительности пауз Параллельная обработка (задействовать все ядра) Инкрементальное уплотнение (чаще, но короче) Не уплотнять – опасность фрагментации
  • 39. Oracle HotSpot Однопоточный сборщик мусора -XX:+UseSerialGC Молодое поколение: • Сборка копированием Старое поколение: • Mark Sweep Compact Возвращает неиспользуемую память ОС после сборки старшего поколения http://aragozin.blogspot.com/2011/09/hotspot-jvm-garbage-collection-options.html
  • 40. Oracle HotSpot Параллельный сборщик мусора -XX:+UseParallelGC –XX:+UseParallelOldGC Молодое поколение: • Многопоточная сборка копированием Старое поколение: • Многопоточный Mark Sweep Compact http://aragozin.blogspot.com/2011/09/hotspot-jvm-garbage-collection-options.html
  • 41. Oracle HotSpot Фоновый сборщик мусора -XX:+UseConcMarkSweepGC Молодое поколение: • Одно или многопоточная сборка копированием Старое поколение: • Фоновая Mark Sweep сборка Не перемещает объекты в старом поколении при сборке в фоновом режиме http://aragozin.blogspot.com/2011/09/hotspot-jvm-garbage-collection-options.html
  • 42. Oracle HotSpot Фоновый сборщик мусора -XX:+UseG1GC Молодое поколение: • Многопоточная сборка копированием Старое поколение: • Инкрементальная многопоточная сборка копированием Возвращает не используемую память ОС http://aragozin.blogspot.com/2011/09/hotspot-jvm-garbage-collection-options.html
  • 43. Oracle’s HotSpot JVM Young 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://blog.ragozin.info/2011/09/hotspot-jvm-garbage-collection-options.html
  • 44. Oracle JRockit -Xgc: option Generational Mark Sweep/Compact genconcon or gencon Yes concurrent incremental singleconcon or singlecon No concurrent incremental genconpar Yes concurrent parallel singleconpar No concurrent parallel genparpar or genpar Yes parallel parallel singleparpar or singlepar No parallel parallel genparcon Yes parallel incremental singleparcon No parallel incremental http://blog.ragozin.info/2011/07/jrockit-gc-in-action.html
  • 45. IBM J9 -Xgcpolicy:optthruput  Одно поколение, stop-the-world сборщик -Xgcpolicy:optavgpause  Одно поколение, частично конкурентный сборщик -Xgcpolicy:gencon  Два поколения, частично конкурентный сборщик
  • 46. Azul Zing • Два поколения • Молодое поколение – конкурентный mark-sweep-compact (MSC) • Старое поколение – конкурентный mark-sweep-compact (MSC) Azul Zing выполняет перемещение объектов (уплотнение памяти) без останова приложения. Ни одна из фаз сборки мусора не требует STW паузы. Секрет – read barrier (барьер чтения).
  • 47. Масштабируемость JVM Может ли JVM работать с большим объёмом памяти (16GiB и более) без “фризов”? Ответ да, если приложение удовлетворяет постулатам гипотезы о поколениях.
  • 48. Рецепт работы без пауз • HotSpot JVM • CMS (Concurrent Mark Sweep) сборщик мусора • Тюнинг Результат • Паузы не более 150ms на 32GiB кучи
  • 49. HotSpot CMS сборщик  Сборка молодого поколения копированием  Не перемещает объекты в старом поколении  Статистические методы борьбы с фрагментацией  Две дополнительные STW фазы  initial-mark, remark  Вся остальная работа происходит в фоне
  • 51. CMS и фрагментация памяти CMS не перемещает объекты в старшем поколении. CMS использует отдельные списки свободного места (FSL) для каждого размера выделяемого блока. Профилактика фрагментации: • увеличение размера кучи • более частые циклы сборки • HotSpot JVM версии 6u26 и старше
  • 52. Советы по настройке CMS Настройка CMS на большом объёме кучи • -XX:MaxNewSize= ? – размер молодого поколения • -XX:CMSWaitDuration= ? • -XX:-CMSConcurrentMTEnabled – защита от бага в JVM • -XX:+UseCMSInitiatingOccupancyOnly • -XX:+CMSClassUnloadingEnabled – если действительно нужно • -XX:ParGCCardsPerStrideChunk= ? – если куча больше 16 GiB • JVM 1.6u26 или более поздняя • плюс логирование GC
  • 53. Другие причины пауз • Свопинг ОС • Обработка ссылок (weak, soft, phantom, JNI) • Объекты требующие “финализации” • JNI, native код может блокировать GC • Проблемы с permanent generation
  • 54. HotSpot G1 G1 (Garbage First) – новый алгоритм в последних версия HotSpot JVM Решит ли он проблему пауз?
  • 55. Можно лучше – OpenJDK патч RFE-7068625 http://blog.ragozin.info/2011/07/openjdk-patch-cutting-down-gc-pause.html
  • 56. ИТОГ: Сборка мусора в JVM  Сборка мусора не чёрная магия  Каждое приложение индивидуально  Приложение не должно мешать сборщику мусора  JVM может работать “почти” без пауз (с паузами не более 100-200ms)  Автоматическое управление памятью не универсально (Проблемные приложения: HBase, Cassandra, …)
  • 57. Альтернативы java.nio.ByteBuffer.allocateDirect() Достоиства • Память выделяется вне кучи • Память освобождается автоматически (через ByteBuffer объект) • Кроссплатформенность, “чистая Java” Недостатки • Фрагментация памяти вне кучи • Память освобождается автоматически (через ByteBuffer объект) • Усложняет многопоточное программирование • -XX:MaxDirectMemorySize=<value>
  • 58. Альтернативы Real Time System Java Иерархия регионов памяти • Объекты выделяются в выбранном регионе • Локальные и “бессмертные” регионы не собираются • Локальные регионы освобождаются целиком • Глобальные объекты не могу ссылаться на локальные