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 может быть пересмотрен.