Полное руководство по ZGC (Z Garbage Collector)

JVM

ZGC - это новый вид, представленный JDK11.Поддержка эластичного масштабированияинизкая задержкаСборщик мусора ZGC может работать под памятью KB~TB.Как параллельный сборщик мусора ZGC гарантирует, что задержка приложения не превысит 10 миллисекунд (даже в случае большой кучи памяти).В JDK11 он выпущен с экспериментальной функции, JDK13, ZGC может поддерживать до 16 ТБ динамической памяти и можетНезадействованная память возвращается в операционную систему.

Зачем вводить ZGC

Хотя автоматическая сборка мусора JVM сокращает работу разработчиков и в определенной степени снижает риск утечек памяти, поскольку сборка мусора выполняется автоматически, некоторые непредсказуемые вещи иногда могут оказывать вредное воздействие на приложение.

  • Увеличенная задержка приводит к увеличению пропускной способности и производительности приложений.

С развитием времени аппаратное обеспечение будет постепенно дешеветь, а память, используемая приложением, будет становиться все больше и больше, но это не может увеличивать задержку и снижать пропускную способность.

ZGC гарантирует, что в любой ситуации задержка не превысит 10 мс.

The Z Garbage Collector, also known as ZGC, is a scalable low latency garbage collector designed to meet the following goals:

  • Pause times do not exceed 10ms
  • Pause times do not increase with the heap or live-set size
  • Handle heaps ranging from a few hundred megabytes to multi terabytes in size

Особенности ZGC

Наиболее характерной особенностью ZGC является то, что этоПараллельный сборщик мусора, и другие функции следующие:

  • Он может помечать память, копировать и перемещать память, все операции параллельны, и у него есть параллельный обработчик ссылок.
  • Все остальные сборщики мусора используютstore barriers, ZGC используетload barriers, для отслеживания памяти
    • заблокировать->разблокировать->чтение->загрузить прочитанную память
    • использовать->назначить->сохранить->записать запись в память
  • ZGC может более гибко настраивать размер и стратегию, по сравнению с G1 лучше справляется с выпуском очень больших объектов
  • ZGC имеет только одно поколение, нет нового поколения, старого поколения и т. д., но ZGC может поддерживать локальное сжатие, и ZGC по-прежнему имеет высокую производительность при восстановлении памяти и миграции (восстановление и перемещение).
  • ZGC полагается на поддержку NUMA (несбалансированный доступ к памяти) и требует, чтобы наша память поддерживала эту функцию.

Расписание функций

  • JDK11, сентябрь 2018 г.
    • Выпущено ZGC
    • Выгрузка классов не поддерживается. -XX:+ClassUnloading не действует
  • JDK12 марта 2019 г.
    • Выгрузка классов с параллельной поддержкой
    • Время паузы еще больше сокращается
  • JDK13 сентября 2019 г.
    • Максимальная память кучи от 4 ТБ -> 16 ТБ
    • Поддержка возврата неиспользуемой памяти, отмена фиксации неиспользуемой памяти
    • Поддерживает платформы Linux и /AArch64.
    • Сокращение времени до фиксированного момента времени (Reduced Time-To-Safepoint)
    • Поддержка -XX:SoftMaxHeapSize , когда этот параметр установлен, ZGC будет пытаться быть меньше указанного размера памяти, если только не избежать переполнения памяти: ссылка:не говорите .open JDK.java.net/browse/JDK-…
  • JDK 14 запланирован на март 2020 года.
    • повысить стабильность
    • Поддержка прерывистых адресных пространств
    • ...

Платформы, поддерживаемые ZGC:

Платформа служба поддержки текущий прогресс
Linux/x64 Y Since JDK 11
Linux/AArch64 Y Since JDK 13
macOS In Progress
Windows In Progress

Принципы сбора мусора

Несколько терминов:

  • parallelНесколько потоков сборки мусора работают вместе, приложение может остановиться
  • serialРаботает только один поток сборщика мусора
  • stop the worldприложение остановлено
  • concurrentСборщик мусора работает в фоновом режиме, и приложение работает одновременно.
  • incrementalПрежде чем работа по сборке мусора будет завершена, сначала остановите сборку мусора, подождите некоторое время и вернитесь, чтобы закончить остальную работу.

ZGC вводит две новые концепции,pointer coloringиload barriers.

Point Coloring

Эта функция позволяет ZGC обнаруживать, помечать, находить и переназначать объекты. Она работает только в 64-разрядных операционных системах. Для реализации цветных указателей требуется маскирование виртуальных адресов.

image-20191107074011335

  • финализируемые объекты могут быть достигнуты с помощью финализаторов
  • отмеченные0 и отмеченные1 помечают достижимые объекты
  • Remap относится к адресу указателя на текущий объект, объект может быть перемещен, этот адрес указывает, что объект перемещен

Load Barrier

Барьер нагрузки — это фрагмент кода, который запускается, когда поток загружает ссылку из кучи. Например, когда мы обращаемся к свойству неосновного типа объекта.

В ZGC барьер нагрузки проверяет биты метаданных ссылки и выполняет некоторую обработку ссылочного объекта в соответствии с битом метаданных, поэтому ссылка на объект может быть изменена, когда мы получаем объект, но это не влияет на наше использование. .

реальный бой

Вы можете загрузить последнюю версию JDK с официального сайта jdk, адрес загрузки:

Woohoo. Сеть Oracle.com/tech…

быстрый старт

Формат маркера журнала GC выглядит следующим образом:

-Xlog:<tag set>,[<tag set>, ...]:<log file>

Просто хочу посмотреть, действует ли ZGC:

-XX:+UnlockExperimentalVMOptions -XX:+UseZGC -Xmx<size> -Xlog:gc

Для просмотра более подробной информации журнала ZGC:

-XX:+UnlockExperimentalVMOptions -XX:+UseZGC -Xmx<size> -Xlog:gc*

Запишите более подробную информацию журнала в файл:

-XX:+UnlockExperimentalVMOptions -XX:+UseZGC -Xmx<size> -Xlog:gc*:gc.log

img

Настройка GC

Общие параметры GC Варианты ZGC Опции диагностики ZGC -XX:+UnlockDiagnosticVMOptions
-XX:MinHeapSize, -Xms -XX:InitialHeapSize, -Xms -XX:MaxHeapSize, -Xmx -XX:SoftMaxHeapSize -XX:SoftRefLRUPolicyMSPerMB -XX:ZAllocationSpikeTolerance -XX:ZCollectionInterval -XX:ZFragmentationLimit -XX:ZMarkStackSpaceLimit -XX:ZPath -XX:ZUncommit -XX:ZUncommitDelay -XX:ZProactive -XX:ZStatisticsInterval -XX:ZVerifyForwarding -XX:ZVerifyMarking -XX:ZVerifyObjects -XX:ZVerifyRoots -XX:ZVerifyViews

Включить ли поддержку NUMA:

# 启用NUMA
-XX:+UseNUMA 

# 停用NUMA
-XX:-UseNUMA 

Отрегулируйте количество одновременных потоков:

-XX:ConcGCThreads=

Вернуть незафиксированную память в операционную систему, память кучи не будет обращаться к установленной минимальной памяти кучи -Xms

# 多久未提交的内存会返回给系统
-XX:+ZUncommit  -XX:ZUncommitDelay=<seconds>

Включение большого пейджинга обычно приводит к повышению производительности за счет увеличения пропускной способности, задержки и времени запуска. Нет явных недостатков

  • Размер больших страниц в системах Linux обычно составляет 2 МБ. Если имеется 16 ГБ динамической памяти, это означает, что требуется 16 ГБ/2 МБ = 8 192 больших страницы. Следующие команды требуют:Linux kernel >= 4.14
# 配置操作系统中的分页池数量
echo 9216 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages

# 查看系统中现在的分页数量
cat /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages


-XX:+UseLargePages
  • еслиLinux kernel < 4.14, то следующим образом
mkdir /hugepages
mount -t hugetlbfs -o uid=123 nodev /hugepages 
java -XX:+UnlockExperimentalVMOptions -XX:+UseZGC -Xms16G -Xmx16G -XX:+UseLargePages

Включите прозрачное пейджинг. Прозрачное пейджинг может вызвать некоторые проблемы с задержкой. Иногда его использование не рекомендуется. Необходимо включить прозрачное пейджинг.Linux kernel < 4.7

# 开启透明分页
echo madvise > /sys/kernel/mm/transparent_hugepage/enabled
echo advise > /sys/kernel/mm/transparent_hugepage/shmem_enabled


-XX:+UseTransparentHugePage

Наконец

ZGC все еще находится на стадии экспериментальной функции, но его гарантированное время задержки не менее 10 мс и текущая поддержка размера кучи все еще стоит попробовать.Будем ожидать, что ZGC станет более совершенным сборщиком мусора.

Ссылаться на