Почему смешанный GC не смог очистить память, а Full DC сделал?

Запуск G1GC (Java 8) ниже

MaxGCPauseMillis=100
InitiatingHeapOccupancyPercent=30
G1MixedGCLiveThresholdPercent=85

и памяти 115 Гб.

Замечаю, что был Full GC и он понизил память со 111Гб до 65Гб. До полного GC было несколько смешанных GC, но они не могли очистить память. Есть ли какой-либо другой параметр, который я должен установить?


person user3660575    schedule 11.12.2018    source источник
comment
Как правило, решения о сборке мусора являются обязанностью среды выполнения. Вам вообще не нужно думать о сборщике мусора, а если и приходится, то существуют шаблоны вроде пулов объектов, предназначенные для смягчения проблем сборщика мусора.   -  person Robert Harvey    schedule 11.12.2018
comment
Если бы смешанный сборщик мусора всегда мог вернуть себе всю память, возможности выполнения полного сборщика мусора не существовало. И если существовала волшебная опция, повышающая производительность каждого приложения, она уже была по умолчанию.   -  person Holger    schedule 12.12.2018
comment
Любые предложения о том, как подойти к этой проблеме?   -  person user3660575    schedule 12.12.2018


Ответы (1)


Оперативный возврат неиспользуемой памяти в операционную систему — это функция OpenJDK 12 для сборщика G1:

Вы соблюдаете ограничение, описанное в предложении: только полные сборщики мусора возвращают память операционной системе, а смешанные/минорные сборщики мусора — нет. Также см. этот связанный вопрос.

person Florian Weimer    schedule 06.01.2019
comment
Спасибо. Я пытаюсь понять, помогут ли следующие варианты. G1OldCSetRegionThresholdPercent=20 G1MixedGCCountTarget=12 - person user3660575; 07.01.2019
comment
Только косвенно, если произойдет увеличение частоты полных GC (из-за чего G1 будет работать плохо). - person Florian Weimer; 07.01.2019