SlideShare una empresa de Scribd logo
1 de 60
Descargar para leer sin conexión
Секреты сборки мусора в 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 сборщика
                                          Initial
    Young collection                                              Remark
                                          mark

  Scan                        Copy      Scan     Scan    Scan     Scan
 thread   Scan dirty cards     live    thread   young   thread   young   Scan dirty cards
 stacks                      objects   stacks   space   stacks   space


          Read      Scan                                                 Read      Scan
          card      dirty                                                card      dirty
          table     pages                                                table     pages
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

Más contenido relacionado

La actualidad más candente

Сборка мусора в .NET
Сборка мусора в .NETСборка мусора в .NET
Сборка мусора в .NETAndrey Akinshin
 
Экосистема Common Lisp
Экосистема Common LispЭкосистема Common Lisp
Экосистема Common LispVsevolod Dyomkin
 
DF1 - BD - Baranov - Mining Large Datasets with Apache Spark
DF1 - BD - Baranov - Mining Large Datasets with Apache SparkDF1 - BD - Baranov - Mining Large Datasets with Apache Spark
DF1 - BD - Baranov - Mining Large Datasets with Apache SparkMoscowDataFest
 
Чему мы можем научиться у Lisp'а?
Чему мы можем научиться у Lisp'а?Чему мы можем научиться у Lisp'а?
Чему мы можем научиться у Lisp'а?Vsevolod Dyomkin
 
разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2Eugeniy Tyumentcev
 
Дополненная Реальность в Облаке
Дополненная Реальность в ОблакеДополненная Реальность в Облаке
Дополненная Реальность в ОблакеGeeksLab Odessa
 
JIT-компиляция в виртуальной машине Java (HighLoad++ 2013)
JIT-компиляция в виртуальной машине Java (HighLoad++ 2013)JIT-компиляция в виртуальной машине Java (HighLoad++ 2013)
JIT-компиляция в виртуальной машине Java (HighLoad++ 2013)aragozin
 
Лекция 12. Spark
Лекция 12. SparkЛекция 12. Spark
Лекция 12. SparkTechnopark
 
2012.11.06 машинное обучение с помощью vw
2012.11.06 машинное обучение с помощью vw2012.11.06 машинное обучение с помощью vw
2012.11.06 машинное обучение с помощью vwИлья Трофимов
 
Павел Артёмкин — Разработка C++ API для реализации алгоритмов на больших графах
Павел Артёмкин — Разработка C++ API для реализации алгоритмов на больших графахПавел Артёмкин — Разработка C++ API для реализации алгоритмов на больших графах
Павел Артёмкин — Разработка C++ API для реализации алгоритмов на больших графахYandex
 
Checkpoint and Restore In Userspace: Готово или нет?
Checkpoint and Restore In Userspace: Готово или нет?Checkpoint and Restore In Userspace: Готово или нет?
Checkpoint and Restore In Userspace: Готово или нет?OpenVZ
 
Modern neural net architectures - Year 2019 version
Modern neural net architectures - Year 2019 versionModern neural net architectures - Year 2019 version
Modern neural net architectures - Year 2019 versionGrigory Sapunov
 
Гареев Роман, Создание генератора промежуточного представления Ssa из полиэдр...
Гареев Роман, Создание генератора промежуточного представления Ssa из полиэдр...Гареев Роман, Создание генератора промежуточного представления Ssa из полиэдр...
Гареев Роман, Создание генератора промежуточного представления Ssa из полиэдр...Darya Zubova
 
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"Fwdays
 
20111204 computer graphics_galinsky_lecture12_real_time
20111204 computer graphics_galinsky_lecture12_real_time20111204 computer graphics_galinsky_lecture12_real_time
20111204 computer graphics_galinsky_lecture12_real_timeComputer Science Club
 

La actualidad más candente (18)

Сборка мусора в .NET
Сборка мусора в .NETСборка мусора в .NET
Сборка мусора в .NET
 
Экосистема Common Lisp
Экосистема Common LispЭкосистема Common Lisp
Экосистема Common Lisp
 
DF1 - BD - Baranov - Mining Large Datasets with Apache Spark
DF1 - BD - Baranov - Mining Large Datasets with Apache SparkDF1 - BD - Baranov - Mining Large Datasets with Apache Spark
DF1 - BD - Baranov - Mining Large Datasets with Apache Spark
 
Чему мы можем научиться у Lisp'а?
Чему мы можем научиться у Lisp'а?Чему мы можем научиться у Lisp'а?
Чему мы можем научиться у Lisp'а?
 
разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2
 
Дополненная Реальность в Облаке
Дополненная Реальность в ОблакеДополненная Реальность в Облаке
Дополненная Реальность в Облаке
 
JIT-компиляция в виртуальной машине Java (HighLoad++ 2013)
JIT-компиляция в виртуальной машине Java (HighLoad++ 2013)JIT-компиляция в виртуальной машине Java (HighLoad++ 2013)
JIT-компиляция в виртуальной машине Java (HighLoad++ 2013)
 
Apache spark
Apache sparkApache spark
Apache spark
 
Лекция 12. Spark
Лекция 12. SparkЛекция 12. Spark
Лекция 12. Spark
 
2012.11.06 машинное обучение с помощью vw
2012.11.06 машинное обучение с помощью vw2012.11.06 машинное обучение с помощью vw
2012.11.06 машинное обучение с помощью vw
 
Павел Артёмкин — Разработка C++ API для реализации алгоритмов на больших графах
Павел Артёмкин — Разработка C++ API для реализации алгоритмов на больших графахПавел Артёмкин — Разработка C++ API для реализации алгоритмов на больших графах
Павел Артёмкин — Разработка C++ API для реализации алгоритмов на больших графах
 
Checkpoint and Restore In Userspace: Готово или нет?
Checkpoint and Restore In Userspace: Готово или нет?Checkpoint and Restore In Userspace: Готово или нет?
Checkpoint and Restore In Userspace: Готово или нет?
 
Modern neural net architectures - Year 2019 version
Modern neural net architectures - Year 2019 versionModern neural net architectures - Year 2019 version
Modern neural net architectures - Year 2019 version
 
Гареев Роман, Создание генератора промежуточного представления Ssa из полиэдр...
Гареев Роман, Создание генератора промежуточного представления Ssa из полиэдр...Гареев Роман, Создание генератора промежуточного представления Ssa из полиэдр...
Гареев Роман, Создание генератора промежуточного представления Ssa из полиэдр...
 
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"
 
20111204 computer graphics_galinsky_lecture12_real_time
20111204 computer graphics_galinsky_lecture12_real_time20111204 computer graphics_galinsky_lecture12_real_time
20111204 computer graphics_galinsky_lecture12_real_time
 
введение в Gpu
введение в Gpuвведение в Gpu
введение в Gpu
 
09 - Hadoop. Pig
09 - Hadoop. Pig09 - Hadoop. Pig
09 - Hadoop. Pig
 

Destacado

Garbage collection in JVM
Garbage collection in JVMGarbage collection in JVM
Garbage collection in JVMaragozin
 
ORM and distributed caching
ORM and distributed cachingORM and distributed caching
ORM and distributed cachingaragozin
 
From distributed caches to in-memory data grids
From distributed caches to in-memory data gridsFrom distributed caches to in-memory data grids
From distributed caches to in-memory data gridsMax Alexejev
 
Database backed coherence cache
Database backed coherence cacheDatabase backed coherence cache
Database backed coherence cachearagozin
 
High Performance Computing - Cloud Point of View
High Performance Computing - Cloud Point of ViewHigh Performance Computing - Cloud Point of View
High Performance Computing - Cloud Point of Viewaragozin
 
Поиск на своем сайте, обзор open source решений
Поиск на своем сайте, обзор open source решенийПоиск на своем сайте, обзор open source решений
Поиск на своем сайте, обзор open source решенийaragozin
 
Performance Test Driven Development (CEE SERC 2013 Moscow)
Performance Test Driven Development (CEE SERC 2013 Moscow)Performance Test Driven Development (CEE SERC 2013 Moscow)
Performance Test Driven Development (CEE SERC 2013 Moscow)aragozin
 
Performance Test Driven Development with Oracle Coherence
Performance Test Driven Development with Oracle CoherencePerformance Test Driven Development with Oracle Coherence
Performance Test Driven Development with Oracle Coherencearagozin
 
Теоретический минимум для понимания Java Memory Model (для JPoint 2014)
Теоретический минимум для понимания Java Memory Model (для JPoint 2014)Теоретический минимум для понимания Java Memory Model (для JPoint 2014)
Теоретический минимум для понимания Java Memory Model (для JPoint 2014)Roman Elizarov
 

Destacado (9)

Garbage collection in JVM
Garbage collection in JVMGarbage collection in JVM
Garbage collection in JVM
 
ORM and distributed caching
ORM and distributed cachingORM and distributed caching
ORM and distributed caching
 
From distributed caches to in-memory data grids
From distributed caches to in-memory data gridsFrom distributed caches to in-memory data grids
From distributed caches to in-memory data grids
 
Database backed coherence cache
Database backed coherence cacheDatabase backed coherence cache
Database backed coherence cache
 
High Performance Computing - Cloud Point of View
High Performance Computing - Cloud Point of ViewHigh Performance Computing - Cloud Point of View
High Performance Computing - Cloud Point of View
 
Поиск на своем сайте, обзор open source решений
Поиск на своем сайте, обзор open source решенийПоиск на своем сайте, обзор open source решений
Поиск на своем сайте, обзор open source решений
 
Performance Test Driven Development (CEE SERC 2013 Moscow)
Performance Test Driven Development (CEE SERC 2013 Moscow)Performance Test Driven Development (CEE SERC 2013 Moscow)
Performance Test Driven Development (CEE SERC 2013 Moscow)
 
Performance Test Driven Development with Oracle Coherence
Performance Test Driven Development with Oracle CoherencePerformance Test Driven Development with Oracle Coherence
Performance Test Driven Development with Oracle Coherence
 
Теоретический минимум для понимания Java Memory Model (для JPoint 2014)
Теоретический минимум для понимания Java Memory Model (для JPoint 2014)Теоретический минимум для понимания Java Memory Model (для JPoint 2014)
Теоретический минимум для понимания Java Memory Model (для JPoint 2014)
 

Similar a Секреты сборки мусора в Java [DUMP-IT 2012]

Борьба с GС паузами в JVM
Борьба с GС паузами в JVMБорьба с GС паузами в JVM
Борьба с GС паузами в JVMaragozin
 
20100307 virtualization igotti_lecture04
20100307 virtualization igotti_lecture0420100307 virtualization igotti_lecture04
20100307 virtualization igotti_lecture04Computer Science Club
 
Дмитрий Грошев, Фёдор Гоголев. Erlang и Haskell в production: проблемы и решения
Дмитрий Грошев, Фёдор Гоголев. Erlang и Haskell в production: проблемы и решенияДмитрий Грошев, Фёдор Гоголев. Erlang и Haskell в production: проблемы и решения
Дмитрий Грошев, Фёдор Гоголев. Erlang и Haskell в production: проблемы и решенияFProg
 
Алексей Рагозин
Алексей РагозинАлексей Рагозин
Алексей РагозинOntico
 
MyRocks: табличный движок для MySQL на основе RocksDB
MyRocks: табличный движок для MySQL на основе RocksDBMyRocks: табличный движок для MySQL на основе RocksDB
MyRocks: табличный движок для MySQL на основе RocksDBSergey Petrunya
 
MyRocks Табличный Движок для MySQL / Алексей Майков (Facebook) / Сергей Петру...
MyRocks Табличный Движок для MySQL / Алексей Майков (Facebook) / Сергей Петру...MyRocks Табличный Движок для MySQL / Алексей Майков (Facebook) / Сергей Петру...
MyRocks Табличный Движок для MySQL / Алексей Майков (Facebook) / Сергей Петру...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
 
Современная операционная система: что надо знать разработчику / Александр Кри...
Современная операционная система: что надо знать разработчику / Александр Кри...Современная операционная система: что надо знать разработчику / Александр Кри...
Современная операционная система: что надо знать разработчику / Александр Кри...Ontico
 
Внутреннее устройство PostgreSQL: временные таблицы и фрагментация памяти / Г...
Внутреннее устройство PostgreSQL: временные таблицы и фрагментация памяти / Г...Внутреннее устройство PostgreSQL: временные таблицы и фрагментация памяти / Г...
Внутреннее устройство PostgreSQL: временные таблицы и фрагментация памяти / Г...Ontico
 
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
 
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...Alexey Paznikov
 
Внедрение параллельного рендеринга в игровой движок
Внедрение параллельного рендеринга в игровой движокВнедрение параллельного рендеринга в игровой движок
Внедрение параллельного рендеринга в игровой движокRoman_Lut
 
Совместное применение графов де Брёйна, графов перекрытий и микросборки для d...
Совместное применение графов де Брёйна, графов перекрытий и микросборки для d...Совместное применение графов де Брёйна, графов перекрытий и микросборки для d...
Совместное применение графов де Брёйна, графов перекрытий и микросборки для d...Anton Alexandrov
 
Caching data outside Java Heap and using Shared Memory in Java
Caching data outside Java Heap and using Shared Memory in JavaCaching data outside Java Heap and using Shared Memory in Java
Caching data outside Java Heap and using Shared Memory in JavaAndrei Pangin
 
Scala performance под капотом
Scala performance под капотомScala performance под капотом
Scala performance под капотомRoman Grebennikov
 
Reinventing the wheel - why do it and how to feel good about it - Julik Tarkh...
Reinventing the wheel - why do it and how to feel good about it - Julik Tarkh...Reinventing the wheel - why do it and how to feel good about it - Julik Tarkh...
Reinventing the wheel - why do it and how to feel good about it - Julik Tarkh...Ruby Meditation
 

Similar a Секреты сборки мусора в Java [DUMP-IT 2012] (20)

Борьба с GС паузами в JVM
Борьба с GС паузами в JVMБорьба с GС паузами в JVM
Борьба с GС паузами в JVM
 
20100307 virtualization igotti_lecture04
20100307 virtualization igotti_lecture0420100307 virtualization igotti_lecture04
20100307 virtualization igotti_lecture04
 
Дмитрий Грошев, Фёдор Гоголев. Erlang и Haskell в production: проблемы и решения
Дмитрий Грошев, Фёдор Гоголев. Erlang и Haskell в production: проблемы и решенияДмитрий Грошев, Фёдор Гоголев. Erlang и Haskell в production: проблемы и решения
Дмитрий Грошев, Фёдор Гоголев. Erlang и Haskell в production: проблемы и решения
 
Алексей Рагозин
Алексей РагозинАлексей Рагозин
Алексей Рагозин
 
High Load
High LoadHigh Load
High Load
 
Garbage collection in V8 VM
Garbage collection in V8 VMGarbage collection in V8 VM
Garbage collection in V8 VM
 
MyRocks: табличный движок для MySQL на основе RocksDB
MyRocks: табличный движок для MySQL на основе RocksDBMyRocks: табличный движок для MySQL на основе RocksDB
MyRocks: табличный движок для MySQL на основе RocksDB
 
MyRocks Табличный Движок для MySQL / Алексей Майков (Facebook) / Сергей Петру...
MyRocks Табличный Движок для MySQL / Алексей Майков (Facebook) / Сергей Петру...MyRocks Табличный Движок для MySQL / Алексей Майков (Facebook) / Сергей Петру...
MyRocks Табличный Движок для MySQL / Алексей Майков (Facebook) / Сергей Петру...
 
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?
 
Современная операционная система: что надо знать разработчику / Александр Кри...
Современная операционная система: что надо знать разработчику / Александр Кри...Современная операционная система: что надо знать разработчику / Александр Кри...
Современная операционная система: что надо знать разработчику / Александр Кри...
 
Внутреннее устройство PostgreSQL: временные таблицы и фрагментация памяти / Г...
Внутреннее устройство PostgreSQL: временные таблицы и фрагментация памяти / Г...Внутреннее устройство PostgreSQL: временные таблицы и фрагментация памяти / Г...
Внутреннее устройство PostgreSQL: временные таблицы и фрагментация памяти / Г...
 
New Android NDK & JNI
New Android NDK & JNINew Android NDK & JNI
New Android NDK & JNI
 
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
 
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
 
Внедрение параллельного рендеринга в игровой движок
Внедрение параллельного рендеринга в игровой движокВнедрение параллельного рендеринга в игровой движок
Внедрение параллельного рендеринга в игровой движок
 
In the sun.misc.Unsafe bowels
In the sun.misc.Unsafe bowelsIn the sun.misc.Unsafe bowels
In the sun.misc.Unsafe bowels
 
Совместное применение графов де Брёйна, графов перекрытий и микросборки для d...
Совместное применение графов де Брёйна, графов перекрытий и микросборки для d...Совместное применение графов де Брёйна, графов перекрытий и микросборки для d...
Совместное применение графов де Брёйна, графов перекрытий и микросборки для d...
 
Caching data outside Java Heap and using Shared Memory in Java
Caching data outside Java Heap and using Shared Memory in JavaCaching data outside Java Heap and using Shared Memory in Java
Caching data outside Java Heap and using Shared Memory in Java
 
Scala performance под капотом
Scala performance под капотомScala performance под капотом
Scala performance под капотом
 
Reinventing the wheel - why do it and how to feel good about it - Julik Tarkh...
Reinventing the wheel - why do it and how to feel good about it - Julik Tarkh...Reinventing the wheel - why do it and how to feel good about it - Julik Tarkh...
Reinventing the wheel - why do it and how to feel good about it - Julik Tarkh...
 

Más de aragozin

Java on Linux for devs and ops
Java on Linux for devs and opsJava on Linux for devs and ops
Java on Linux for devs and opsaragozin
 
I know why your Java is slow
I know why your Java is slowI know why your Java is slow
I know why your Java is slowaragozin
 
Java profiling Do It Yourself (jug.msk.ru 2016)
Java profiling Do It Yourself (jug.msk.ru 2016)Java profiling Do It Yourself (jug.msk.ru 2016)
Java profiling Do It Yourself (jug.msk.ru 2016)aragozin
 
Java black box profiling JUG.EKB 2016
Java black box profiling JUG.EKB 2016Java black box profiling JUG.EKB 2016
Java black box profiling JUG.EKB 2016aragozin
 
Распределённое нагрузочное тестирование на Java
Распределённое нагрузочное тестирование на JavaРаспределённое нагрузочное тестирование на Java
Распределённое нагрузочное тестирование на Javaaragozin
 
What every Java developer should know about network?
What every Java developer should know about network?What every Java developer should know about network?
What every Java developer should know about network?aragozin
 
Java profiling Do It Yourself
Java profiling Do It YourselfJava profiling Do It Yourself
Java profiling Do It Yourselfaragozin
 
DIY Java Profiler
DIY Java ProfilerDIY Java Profiler
DIY Java Profileraragozin
 
Java black box profiling
Java black box profilingJava black box profiling
Java black box profilingaragozin
 
Блеск и нищета распределённых кэшей
Блеск и нищета распределённых кэшейБлеск и нищета распределённых кэшей
Блеск и нищета распределённых кэшейaragozin
 
JIT compilation in modern platforms – challenges and solutions
JIT compilation in modern platforms – challenges and solutionsJIT compilation in modern platforms – challenges and solutions
JIT compilation in modern platforms – challenges and solutionsaragozin
 
Casual mass parallel computing
Casual mass parallel computingCasual mass parallel computing
Casual mass parallel computingaragozin
 
Nanocloud cloud scale jvm
Nanocloud   cloud scale jvmNanocloud   cloud scale jvm
Nanocloud cloud scale jvmaragozin
 
Virtualizing Java in Java (jug.ru)
Virtualizing Java in Java (jug.ru)Virtualizing Java in Java (jug.ru)
Virtualizing Java in Java (jug.ru)aragozin
 
Filtering 100M objects in Coherence cache. What can go wrong?
Filtering 100M objects in Coherence cache. What can go wrong?Filtering 100M objects in Coherence cache. What can go wrong?
Filtering 100M objects in Coherence cache. What can go wrong?aragozin
 
Распределённый кэш или хранилище данных. Что выбрать?
Распределённый кэш или хранилище данных. Что выбрать?Распределённый кэш или хранилище данных. Что выбрать?
Распределённый кэш или хранилище данных. Что выбрать?aragozin
 
Devirtualization of method calls
Devirtualization of method callsDevirtualization of method calls
Devirtualization of method callsaragozin
 
Tech talk network - friend or foe
Tech talk   network - friend or foeTech talk   network - friend or foe
Tech talk network - friend or foearagozin
 
Coherence SIG: Advanced usage of indexes in coherence
Coherence SIG: Advanced usage of indexes in coherenceCoherence SIG: Advanced usage of indexes in coherence
Coherence SIG: Advanced usage of indexes in coherencearagozin
 

Más de aragozin (19)

Java on Linux for devs and ops
Java on Linux for devs and opsJava on Linux for devs and ops
Java on Linux for devs and ops
 
I know why your Java is slow
I know why your Java is slowI know why your Java is slow
I know why your Java is slow
 
Java profiling Do It Yourself (jug.msk.ru 2016)
Java profiling Do It Yourself (jug.msk.ru 2016)Java profiling Do It Yourself (jug.msk.ru 2016)
Java profiling Do It Yourself (jug.msk.ru 2016)
 
Java black box profiling JUG.EKB 2016
Java black box profiling JUG.EKB 2016Java black box profiling JUG.EKB 2016
Java black box profiling JUG.EKB 2016
 
Распределённое нагрузочное тестирование на Java
Распределённое нагрузочное тестирование на JavaРаспределённое нагрузочное тестирование на Java
Распределённое нагрузочное тестирование на Java
 
What every Java developer should know about network?
What every Java developer should know about network?What every Java developer should know about network?
What every Java developer should know about network?
 
Java profiling Do It Yourself
Java profiling Do It YourselfJava profiling Do It Yourself
Java profiling Do It Yourself
 
DIY Java Profiler
DIY Java ProfilerDIY Java Profiler
DIY Java Profiler
 
Java black box profiling
Java black box profilingJava black box profiling
Java black box profiling
 
Блеск и нищета распределённых кэшей
Блеск и нищета распределённых кэшейБлеск и нищета распределённых кэшей
Блеск и нищета распределённых кэшей
 
JIT compilation in modern platforms – challenges and solutions
JIT compilation in modern platforms – challenges and solutionsJIT compilation in modern platforms – challenges and solutions
JIT compilation in modern platforms – challenges and solutions
 
Casual mass parallel computing
Casual mass parallel computingCasual mass parallel computing
Casual mass parallel computing
 
Nanocloud cloud scale jvm
Nanocloud   cloud scale jvmNanocloud   cloud scale jvm
Nanocloud cloud scale jvm
 
Virtualizing Java in Java (jug.ru)
Virtualizing Java in Java (jug.ru)Virtualizing Java in Java (jug.ru)
Virtualizing Java in Java (jug.ru)
 
Filtering 100M objects in Coherence cache. What can go wrong?
Filtering 100M objects in Coherence cache. What can go wrong?Filtering 100M objects in Coherence cache. What can go wrong?
Filtering 100M objects in Coherence cache. What can go wrong?
 
Распределённый кэш или хранилище данных. Что выбрать?
Распределённый кэш или хранилище данных. Что выбрать?Распределённый кэш или хранилище данных. Что выбрать?
Распределённый кэш или хранилище данных. Что выбрать?
 
Devirtualization of method calls
Devirtualization of method callsDevirtualization of method calls
Devirtualization of method calls
 
Tech talk network - friend or foe
Tech talk   network - friend or foeTech talk   network - friend or foe
Tech talk network - friend or foe
 
Coherence SIG: Advanced usage of indexes in coherence
Coherence SIG: Advanced usage of indexes in coherenceCoherence SIG: Advanced usage of indexes in coherence
Coherence SIG: Advanced usage of indexes in coherence
 

Секреты сборки мусора в Java [DUMP-IT 2012]

  • 1. Секреты сборки мусора в Java Алексей Рагозин alexey.ragozin@gmail.com
  • 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  Вся остальная работа происходит в фоне
  • 50. Длительность пауз CMS сборщика Initial Young collection Remark mark Scan Copy Scan Scan Scan Scan thread Scan dirty cards live thread young thread young Scan dirty cards stacks objects stacks space stacks space Read Scan Read Scan card dirty card dirty table pages table pages
  • 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 Иерархия регионов памяти • Объекты выделяются в выбранном регионе • Локальные и “бессмертные” регионы не собираются • Локальные регионы освобождаются целиком • Глобальные объекты не могу ссылаться на локальные
  • 60. Спасибо http://blog.ragozin.info - мои статьи о JVM и не только Алексей Рагозин alexey.ragozin@gmail.com