Почему 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?

2 ответа

Из oracle gc tuning статья 1 и статья 2:

Survivor Space Sizing

Вы можете использовать параметр 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 установка

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

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

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

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

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

-XX: SurvivorRatio = 1

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

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

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

Другие вопросы по тегам