Почему JVM рассчитала размер PS Survivor Space слишком мало для параллельного сборщика

Я использую JDK1.6.0_16 JVM для java-приложения, размещенного на Linux Intel procesor 80 cores machine.

при запуске приложения Java у меня есть только два параметра, настроенных -Xms2048m -Xmx8000m в параметрах JVM (после команды java). Я вижу, что PS Old Gen рассчитывается как 5.21G, а PS Eden рассчитывается как 2.6G, но пространство PS Survivor равно 25MB.

У меня точно такая же JVM в производстве, и в этом PS Survivor Space размер отображается как 888MB. Я вижу эти размеры на вкладке памяти Java Mission Control. Размер кеша (вывод /proc/cpuinfo) показывает 24656 как в UAT, так и в производственных полях.

Не думаю, что это будет иметь какое-либо значение для JVM, но все же упомянем, что во время запуска JVM нагрузка на машину была очень низкой.

Не могли бы вы сообщить, какие параметры JVM учитывает для расчета размера PS Survivor Space?


person Lokesh Garg    schedule 05.04.2016    source источник
comment
еще кое-что. Машина имеет 256 ГБ физической памяти, из которых ~ 200 ГБ свободно (включая буфер и кеш и исключая подкачку).   -  person Lokesh Garg    schedule 06.04.2016
comment
и после установки -XX:SurvivorRatio=1 (после установки других значений, таких как 8, 6, 5), размер PS Survivor Space просто увеличился до 220 МБ. Установка значения 8 не имела никакого эффекта, а затем установка значения 6 имела только изменение поля.   -  person Lokesh Garg    schedule 06.04.2016


Ответы (2)


Подскажите, пожалуйста, какие параметры JVM учитывает для расчета размера PS Survivor Space?

Он должен быть достаточно большим, чтобы никогда не заполняться после сбора пространства Eden, иначе вы получите полные GC, что нежелательно.

Оптимальный размер пространства Survivor зависит от вашего приложения. Я предлагаю вам протестировать ваше приложение при реальных нагрузках с большим пространством Eden и Survivor, чем вы считаете полезным, и посмотреть, сколько этого пространства когда-либо используется, и добавить от 50% до 100% в зависимости от того, что вы видите.

Машина имеет 256 ГБ физической памяти, из которых ~ 200 ГБ.

Размер кучи по умолчанию составляет 32 ГБ, и я предлагаю вам использовать это значение по умолчанию, если у вас нет веских причин для его уменьшения.

-XX:Коэффициент выживания=1

Обычно это плохая идея, и иметь высокий коэффициент выживаемости, например 8, обычно лучше.

Установка значения на 8 не имела никакого эффекта

Скорее всего у вас низкий уровень аллокации. Обычно я устанавливаю большое пространство Янга, например -Xmn8g или даже -Xmn24g, но хорошо это или плохо, зависит от вашего приложения.

person Peter Lawrey    schedule 06.04.2016
comment
@ 4999394 Я не могу проверить, потому что из-за малого размера Survivor Space выживший все время пуст, а Eden всегда полон. поэтому Объекты перемещаются напрямую из Эдема в старое поколение из-за низкого количества PS Survivor Space. Поэтому мне нужно правильно настроить PS Survivor Space. Что меня озадачивает, так это то, что та же JVM в производстве выделяет гораздо больше памяти, т.е. по умолчанию SurvivorRatio=8. В среде UAT значение SurvivorRatio по умолчанию равно 8, но фактическое соотношение Eden и Survivor равно 106 (2,6 ГБ * 1024/25 МБ). Я установил различные SurvivorRatios, чтобы увидеть влияние на SurvivorSpace, но без значительного увеличения. - person Lokesh Garg; 06.04.2016
comment
@NewMember Насколько похожа нагрузка на производство и UAT? - person Peter Lawrey; 06.04.2016
comment
Производство очень сильно загружено вокруг отдельных экземпляров jvm, и у каждого есть своя работа. 5 экземпляров имеют выделение памяти в куче в моих вопросах выше. другие имеют максимальный размер кучи как 2G-4G, но у каждого экземпляра есть что делать. Экземпляр UAT очень тихий и имеет всего 8 экземпляров jvm. - person Lokesh Garg; 06.04.2016
comment
@NewMember Разница в том, что нагрузки достаточно, чтобы иметь такое значение. - person Peter Lawrey; 06.04.2016
comment
@Ravindra Спасибо за внимание и ценную помощь. Я применил ‹code›-Xmn4g ‹/code› и ‹code›-XX:SurvivorRatio=4‹/code›, чтобы достичь размеров пространства Eden и Survivor в UAT и почти до размера пространства, сравнимого с Prod. Не идеально, но, по крайней мере, я могу проверить. Я постараюсь увеличить количество экземпляров в UAT и буду наблюдать и информировать. Спасибо. - person Lokesh Garg; 06.04.2016

Из настройки oracle gc статьи 1 и статья 2:

Размер пространства для выживших

Вы можете использовать параметр SurvivorRatio для настройки размера выжившего пространства, но это часто не важно для производительности. Например, -XX:SurvivorRatio=6 устанавливает соотношение между Эдемом и выжившим равным 1:6.

In other words, each survivor space will be one-sixth the size of eden, and thus one-eighth the size of the young generation (not one-seventh, because there are two survivor spaces).

Если пространства оставшихся в живых слишком мало, коллекция копий переполняется непосредственно в постоянном поколении. Если места для выживших слишком велики, они будут бесполезно пусты.

Параметры NewSize и MaxNewSize управляют минимальным и максимальным размером нового поколения. Отрегулируйте размер нового поколения, установив эти параметры равными. The bigger the younger generation, the less often minor collections occur.

NewRatio: Размер молодого поколения по сравнению со старым поколением контролируется NewRatio. Например, установка -XX:NewRatio=3 означает, что соотношение между старым и молодым поколением составляет 1:3, the combined size of eden and the survivor spaces will be fourth of the heap.

Как правильно процитировал Peter Lawrey, установка оставшегося в живых зависит от типа вашего приложения. Вот рекомендации из статьи о настройке gc от Oracle.

  1. First decide the maximum heap size you can afford to give the virtual machine. Затем сопоставьте свой показатель производительности с размерами молодого поколения, чтобы найти наилучшие настройки.

  2. If the total heap size is fixed, then increasing the young generation size requires reducing the tenured generation size. Сохраняйте постоянное поколение достаточно большим, чтобы хранить все оперативные данные, используемые приложением в любой момент времени, а также некоторый объем резервного пространства (от 10 до 20 % или более).

  3. С учетом ранее установленного ограничения для постоянного поколения: Предоставить много памяти молодому поколению и increase the young generation size as you increase the number of processors, because allocation can be parallelized. Значение по умолчанию рассчитывается из NewRatio и настройки -Xmx.

person Ravindra babu    schedule 06.04.2016