Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

5,458 views

Published on

Слайды с презентации на dump-it.ru (2012)

  • Be the first to comment

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

  1. 1. Секреты сборки мусора в Java Алексей Рагозин alexey.ragozin@gmail.com
  2. 2. О чём этот доклад?• Обзор проблемы автоматического управления памятью• Stop-the-world паузы – причины• Сборка мусора в современных JVM
  3. 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. 4. Способы сборки мусораМусор – структура данных (объект) в памяти недостижимый из программного кода. Подсчёт ссылок Транзитивное замыкание ссылок Вообще не собирать
  5. 5. Подсчёт ссылок+ Просто+ Не требует пауз для сбора мусора– Не очищает циклические графы– Дополнительные 15-30% нагрузки CPU– Плохо сочетается с много поточностью
  6. 6. Транзитивное замыкание ссылок• Корневой набор ссылок  Статические переменные  Локальные переменные• Объекты достижимые из корневых ссылок – живые• Объекты недостижимые из корневых ссылок – мусорВ общем случае, граф объектов не должен меняться по мере обхода.Следовательно, прикладные потоки должны быть остановлены покаидёт сборка мусора.
  7. 7. Алгоритмы сборки мусора• Mark-Sweep  Фаза 1 – маркировка достижимых объектов  Фаза 2 – “вычистка” мусора• Copy collector (сборка копированием)  Использует две области памяти, но выполняется в один проход• Mark-Sweep-Compact  Mark-Sweep + перемещение живых объектов
  8. 8. Трёх цветная маркировка roots
  9. 9. Трёх цветная маркировка roots
  10. 10. Трёх цветная маркировка roots
  11. 11. Трёх цветная маркировка roots
  12. 12. Сборка копированием roots FROM TO
  13. 13. Сборка копированием roots FROM TO
  14. 14. Сборка копированием roots 1 FROM TO
  15. 15. Сборка копированием roots 1 2 FROM TO
  16. 16. Сборка копированием roots 1 2 FROM TO
  17. 17. Сборка копированием roots 3 1 2 FROM TO
  18. 18. Экономика сборки мусора S – объём кучи Объём L – объём живых объектов мусора в куче Copy collection SL  Эффективность  c  L Mark-Sweep SL SL  Эффективность  c1   c2  L S
  19. 19. Слабая гипотеза о поколенияхПостулаты Большинство объектов умирают молодыми Число ссылок на молодые объекты малоСледствиеЕсли хранить молодые объекты отдельно от старых, можнообеспечить высокую пропускную способность (молодоепоколение) и эффективное использование памяти (староепоколение).
  20. 20. Демография объектов в куче Период молодой сборки Смертность (байт/с) Период старой сборки ∞ Возраст объектов
  21. 21. Generational collection Молодое поколение  Сборщик настроен на пропускную способность Старое поколение  Сборщик настроен на эффективное использование памяти Продвижение (promotion) объектов в старое поколение  Сборщик молодого поколения копирует живые объекты в старое поколение после достижения “зрелого” возраста
  22. 22. Generational collectionКак получить все указатели из старогопоколения на молодое?Ответ – барьер на записьКаждый раз при записи указателя в память в“старом” пространстве, срабатывает барьер
  23. 23. Молодая сборка HotSpot JVM Eden S1 S2 Tenured Dirty cards Collect roots for young GC Scan stack traces Scan dirty pages in old space Сбор “корневых” ссылок
  24. 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. 25. Молодая сборка HotSpot JVM Eden S1 S2 Tenured Dirty cards Области памяти, не помеченные в таблице карт, не могут содержать ссылки на молодое поколение Сборка закончена
  26. 26. Stop-the-world паузы• Изменение графа объектов во время обхода может привести к пропуску достижимых объектов• Большинство managed runtimes может перемещать объекты только в режиме паузы
  27. 27. Stop-the-world паузыПараллельные (parallel) алгоритмы Используют несколько потоков чтобы сократить время паузФоновые (concurrent) алгоритмы Выполняют большую часть работы в фоновом режиме (без STW пауз)Инкрементальные алгоритмы Много маленьких STW вместо одной длительной
  28. 28. Фоновая маркировкаПроблема Граф объектов меняется по мере обхода ** Даже в функциональных языках могут выполнятьсяотложенные вычисления, меняющие графРешение барьер на запись – отслеживать ссылкиизменившиеся за время обхода
  29. 29. Фоновая маркировка Card marking write barrier  HotSpot CMS, JRockit, IBM J9 Snapshot-at-the-beginning (SATB) write barrier  HotSpot G1 Альтернатива барьеру на запись – барьер на чтение  Azul Zing JVM
  30. 30. SATB барьер записи (G1) C GC A A B C D
  31. 31. SATB барьер записи (G1) D GC C A B C D
  32. 32. SATB барьер записи (G1) D GC C A B C D Очередь ссылок: B D Reference queue:
  33. 33. SATB барьер записи (G1) D GC C A B C D
  34. 34. SATB барьер записи (G1) D GC D A B C D
  35. 35. SATB барьер записи (G1) GC A B C D Очередь ссылок: B D Reference queue:
  36. 36. SATB барьер записи (G1) D GC B A B C D Reference ссылок: пусто Очередь queue: empty
  37. 37. “Card marking” барьер записи  [пауза] Сбор корневых ссылок  [фон] Обход графа объектов  [фон] Перемаркирова “грязных” страниц  [паузa] Финальная перемаркирова
  38. 38. Перемещение объектовБольшинство JVM не может перемещать объектыбез STW паузы.Цель – уменьшение длительности пауз Параллельная обработка (задействовать все ядра) Инкрементальное уплотнение (чаще, но короче) Не уплотнять – опасность фрагментации
  39. 39. Oracle HotSpotОднопоточный сборщик мусора-XX:+UseSerialGCМолодое поколение:• Сборка копированиемСтарое поколение:• Mark Sweep CompactВозвращает неиспользуемуюпамять ОС после сборки старшего поколения http://aragozin.blogspot.com/2011/09/hotspot-jvm-garbage-collection-options.html
  40. 40. Oracle HotSpotПараллельный сборщик мусора-XX:+UseParallelGC –XX:+UseParallelOldGCМолодое поколение:• Многопоточная сборка копированиемСтарое поколение:• Многопоточный Mark Sweep Compact http://aragozin.blogspot.com/2011/09/hotspot-jvm-garbage-collection-options.html
  41. 41. Oracle HotSpotФоновый сборщик мусора-XX:+UseConcMarkSweepGCМолодое поколение:• Одно или многопоточная сборка копированиемСтарое поколение:• Фоновая Mark Sweep сборкаНе перемещает объекты в старом поколении при сборке вфоновом режиме http://aragozin.blogspot.com/2011/09/hotspot-jvm-garbage-collection-options.html
  42. 42. Oracle HotSpotФоновый сборщик мусора-XX:+UseG1GCМолодое поколение:• Многопоточная сборка копированиемСтарое поколение:• Инкрементальная многопоточная сборка копированиемВозвращает не используемую память ОС http://aragozin.blogspot.com/2011/09/hotspot-jvm-garbage-collection-options.html
  43. 43. Oracle’s HotSpot JVMYoung collector Old collector JVM optionSerial (DefNew) Serial Mark-Sweep-Compact -XX:+UseSerialGCParallel scavenge (PSYoungGen) Serial Mark-Sweep-Compact (PSOldGen) -XX:+UseParallelGCParallel scavenge (PSYoungGen) Parallel Mark-Sweep-Compact (ParOldGen) -XX:+UseParallelOldGCSerial (DefNew) Concurrent Mark Sweep -XX:+UseConcMarkSweepGC -XX:-UseParNewGCParallel (ParNew) Concurrent Mark Sweep -XX:+UseConcMarkSweepGC -XX:+UseParNewGCG1 -XX:+UseG1GC http://blog.ragozin.info/2011/09/hotspot-jvm-garbage-collection-options.html
  44. 44. Oracle JRockit-Xgc: option Generational Mark Sweep/Compactgenconcon or gencon Yes concurrent incrementalsingleconcon or singlecon No concurrent incrementalgenconpar Yes concurrent parallelsingleconpar No concurrent parallelgenparpar or genpar Yes parallel parallelsingleparpar or singlepar No parallel parallelgenparcon Yes parallel incrementalsingleparcon No parallel incremental http://blog.ragozin.info/2011/07/jrockit-gc-in-action.html
  45. 45. IBM J9-Xgcpolicy:optthruput Одно поколение, stop-the-world сборщик-Xgcpolicy:optavgpause Одно поколение, частично конкурентный сборщик-Xgcpolicy:gencon Два поколения, частично конкурентный сборщик
  46. 46. Azul Zing• Два поколения• Молодое поколение – конкурентный mark-sweep-compact (MSC)• Старое поколение – конкурентный mark-sweep-compact (MSC)Azul Zing выполняет перемещение объектов (уплотнениепамяти) без останова приложения. Ни одна из фаз сборкимусора не требует STW паузы.Секрет – read barrier (барьер чтения).
  47. 47. Масштабируемость JVMМожет ли JVM работать с большим объёмомпамяти (16GiB и более) без “фризов”?Ответ да, если приложение удовлетворяетпостулатам гипотезы о поколениях.
  48. 48. Рецепт работы без пауз• HotSpot JVM• CMS (Concurrent Mark Sweep) сборщик мусора• ТюнингРезультат• Паузы не более 150ms на 32GiB кучи
  49. 49. HotSpot CMS сборщик Сборка молодого поколения копированием Не перемещает объекты в старом поколении Статистические методы борьбы с фрагментацией Две дополнительные STW фазы  initial-mark, remark Вся остальная работа происходит в фоне
  50. 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. 51. CMS и фрагментация памяти CMS не перемещает объекты в старшем поколении. CMS использует отдельные списки свободного места (FSL) для каждого размера выделяемого блока. Профилактика фрагментации: • увеличение размера кучи • более частые циклы сборки • HotSpot JVM версии 6u26 и старше
  52. 52. Советы по настройке CMSНастройка CMS на большом объёме кучи• -XX:MaxNewSize= ? – размер молодого поколения• -XX:CMSWaitDuration= ?• -XX:-CMSConcurrentMTEnabled – защита от бага в JVM• -XX:+UseCMSInitiatingOccupancyOnly• -XX:+CMSClassUnloadingEnabled – если действительно нужно• -XX:ParGCCardsPerStrideChunk= ? – если куча больше 16 GiB• JVM 1.6u26 или более поздняя• плюс логирование GC
  53. 53. Другие причины пауз• Свопинг ОС• Обработка ссылок (weak, soft, phantom, JNI)• Объекты требующие “финализации”• JNI, native код может блокировать GC• Проблемы с permanent generation
  54. 54. HotSpot G1G1 (Garbage First) – новый алгоритм впоследних версия HotSpot JVM Решит ли он проблему пауз?
  55. 55. Можно лучше – OpenJDK патч RFE-7068625 http://blog.ragozin.info/2011/07/openjdk-patch-cutting-down-gc-pause.html
  56. 56. ИТОГ: Сборка мусора в JVM Сборка мусора не чёрная магия Каждое приложение индивидуально Приложение не должно мешать сборщику мусора JVM может работать “почти” без пауз (с паузами не более 100-200ms) Автоматическое управление памятью не универсально (Проблемные приложения: HBase, Cassandra, …)
  57. 57. Альтернативыjava.nio.ByteBuffer.allocateDirect()Достоиства• Память выделяется вне кучи• Память освобождается автоматически (через ByteBuffer объект)• Кроссплатформенность, “чистая Java”Недостатки• Фрагментация памяти вне кучи• Память освобождается автоматически (через ByteBuffer объект)• Усложняет многопоточное программирование• -XX:MaxDirectMemorySize=<value>
  58. 58. АльтернативыReal Time System JavaИерархия регионов памяти• Объекты выделяются в выбранном регионе• Локальные и “бессмертные” регионы не собираются• Локальные регионы освобождаются целиком• Глобальные объекты не могу ссылаться на локальные
  59. 59. АльтернативыUnsafe Java™sun.misc.Unsafe• Unsafe.allocateMemory(…)• Unsafe.reallocateMemory(…)• Unsafe.freeMemory(…)
  60. 60. Спасибоhttp://blog.ragozin.info- мои статьи о JVM и не только Алексей Рагозин alexey.ragozin@gmail.com

×