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-разрядных операционных системах. Для реализации цветных указателей требуется маскирование виртуальных адресов.
- финализируемые объекты могут быть достигнуты с помощью финализаторов
- отмеченные0 и отмеченные1 помечают достижимые объекты
- Remap относится к адресу указателя на текущий объект, объект может быть перемещен, этот адрес указывает, что объект перемещен
Load Barrier
Барьер нагрузки — это фрагмент кода, который запускается, когда поток загружает ссылку из кучи. Например, когда мы обращаемся к свойству неосновного типа объекта.
В ZGC барьер нагрузки проверяет биты метаданных ссылки и выполняет некоторую обработку ссылочного объекта в соответствии с битом метаданных, поэтому ссылка на объект может быть изменена, когда мы получаем объект, но это не влияет на наше использование. .
реальный бой
Вы можете загрузить последнюю версию JDK с официального сайта jdk, адрес загрузки:
быстрый старт
Формат маркера журнала 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
Настройка 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 станет более совершенным сборщиком мусора.