Java G1GC никогда не собирает Old Gen

Я проводил свои верные тесты, и это привело меня к пределу накладных расходов GC. Однако, проанализировав статистику памяти и снимки, я понял, что почти 800 МБ были потрачены впустую при дублировании строк.

Изучив аргументы VM и другие параметры времени выполнения, я понял, что используемый GC был PS (Parallel Scavenger — по умолчанию из JVM).

Я изменил верный argLine для использования

-XX:+UseG1GC -XX:+UseStringDeduplication -XX:+PrintStringDeduplicationStatistics

Теперь мои тестовые прогоны используют G1GC.

Ниже приведено сравнение до и после переключения GC

введите здесь описание изображения

Если вас интересует статистика дедупликации. Вот он: введите здесь описание изображения

Мой вопрос: почему G1GC использует так много данных Old Gen и не собирает их в течение всего периода тестирования. Он продолжает расти.

Остальное окружение, аргументы и все остальное остается прежним. Единственное, что меняется, — это алгоритм GC и дедупликация.

Я тоже просматривал похожие темы

Смешанный gc JVM G1GC не собирает много старых регионов

Функция дедупликации строк в Java 8

https://openjdk.java.net/jeps/192


person dharam    schedule 15.11.2018    source источник


Ответы (1)


G1GC не будет выполнять сборку старого поколения, пока не будет достигнуто пороговое значение (по умолчанию 45% от общей кучи). Вы можете управлять этим порогом, установив XX:InitiatingHeapOccupancyPercent на другое значение.

person David Soroko    schedule 08.12.2018
comment
Является ли это значение действительно значением по умолчанию? Я работаю без явной установки этого процента, и моя текущая куча старого поколения в настоящее время составляет 78% от максимальной кучи. - person Gorgon_Union; 03.12.2019
comment
@Gorgon_Union, ответ неверный, этот флаг вызовет фазу mark после молодой коллекции, если это приведет к полному GC или смешанному GC, это другой вопрос. - person Eugene; 18.01.2020