openjdk.ruOpenJDK на русском

JEP 366: Deprecate the ParallelScavenge + SerialOld GC Combination

Перевод комбинации сборщиков мусора ParallelScavenge + SerialOld в статус Deprecated (устаревший)

ОтветственныйThomas Schatzl
ТипFeature
ОбластьImplementation
СтатусClosed / Delivered
Выпуск14
Компонентhotspot / gc
Обсуждениеhotspot dash gc dash dev at openjdk dot java dot net
ТрудоёмкостьXS
ДлительностьXS
РецензентыErik Helin, Kim Barrett, Mikael Vidstedt, Stefan Karlsson
ОдобренMikael Vidstedt
Создан2019/08/13 18:07
Обновлён2020/02/28 09:20
Задача8229492

Аннотация

Перевести в статус Deprecated комбинацию алгоритмов сборки мусора Parallel Scavenge и Serial Old.

Что не является целью

  • Удаление этой комбинации сборщиков мусора не является целью.

  • Перевод в статус Deprecated каких-либо других комбинаций сборщиков мусора не является целью.

Мотивация

Есть одна комбинация алгоритмов сборки мусора, которая, как мы считаем, используется очень редко, но требует значительных усилий на сопровождение: сочетание параллельного сборщика молодого поколения (называемого ParallelScavenge) и последовательного сборщика старого поколения (называемого SerialOld). Пользователь должен явно включить эту комбинацию параметрами командной строки -XX:+UseParallelGC -XX:-UseParallelOldGC.

Эта комбинация необычна: в ней сочетаются параллельный алгоритм сборки мусора для молодого поколения и последовательный для старого поколения. Мы считаем, что она полезна только для развёртываний с очень большим молодым поколением и очень маленьким старым поколением. В таком сценарии время пауз полной сборки может быть приемлемым благодаря небольшому размеру старого поколения. На практике такое развёртывание встречается очень редко и связано с риском: поскольку старое поколение значительно меньше молодого, даже небольшое изменение доли живых объектов в молодом поколении приведёт к OutOfMemoryException. Единственное преимущество этой комбинации по сравнению с использованием параллельного алгоритма сборки мусора и для молодого, и для старого поколения — немного меньший общий расход памяти. Мы считаем, что этого небольшого преимущества в объёме занимаемой памяти (не более ~3 % размера кучи Java) недостаточно, чтобы перевесить затраты на сопровождение этой комбинации сборщиков мусора.

Описание

Помимо перевода в статус Deprecated комбинации параметров -XX:+UseParallelGC -XX:-UseParallelOldGC, мы также переведём в статус Deprecated параметр -XX:UseParallelOldGC, поскольку его единственное назначение — отключить параллельный сборщик старого поколения и тем самым включить последовательный сборщик старого поколения.

В результате при любом явном использовании параметра UseParallelOldGC будет выводиться предупреждение о статусе Deprecated. В частности, предупреждение будет выводиться, когда -XX:+UseParallelOldGC используется отдельно (без -XX:+UseParallelGC) для выбора параллельных алгоритмов сборки мусора для молодого и старого поколений.

Единственный способ выбрать параллельные алгоритмы сборки мусора для молодого и старого поколений без предупреждения о статусе Deprecated — указать в командной строке только -XX:+UseParallelGC.

Альтернативы

Единственное изменение — сообщение о статусе Deprecated; никакая функциональность не теряется. Существующий сборщик под названием «Parallel», сочетающий параллельные алгоритмы для молодого и старого поколений, ведёт себя почти так же и должен стать прямой заменой.

Риски и допущения

Мы предполагаем, что у этой комбинации сборщиков мусора очень мало пользователей. Если у этой комбинации всё же окажется значительное число пользователей, перевод в статус Deprecated может быть пересмотрен.