Как мне настроить CMS для моего приложения?

Проблема такая.

Мы используем CMS и испытываем сбой в параллельном режиме (занимает около 15 секунд). Использование JRE 8.

Уже используются UseCMSInitiatingOccupancyOnly и CMSInitiatingOccupancyFraction (80%). Не использовать CMSScavengeBeforeRemark.

Схема распределения такова:

Выделено много короткоживущих объектов. Итак, мы используем большое молодое поколение, 2 ГБ. Пространство выжившего не настроено. MaxTenuringThreshold установлен на 15. CMS срабатывает каждые несколько часов.

Старое поколение 4 Гб. Использование памяти высокое. После каждой коллекции у старого поколения остается около 30% свободного места. К сожалению, памяти больше нет. Мы планируем изменить программу, чтобы она использовала меньше памяти, но это требует времени.

Обычно у программы не так много работы, но каждые несколько часов (мы не можем предсказать, когда) мы очень заняты. А 15-секундный STW — это слишком долго.

Итак, мой вопрос:

Как мы можем настроить CMS для нашей программы?

Должен ли я увеличивать старое поколение (и уменьшать молодое)?

Должен ли я настроить Survivor?

Должен ли я изменить CMSInitiatingOccupancyFraction?

Поможет ли G1GC?


person ntysdd    schedule 28.09.2017    source источник
comment
Вы пробовали +XX:+UseParallelOldGC? Учитывая, что у вас достаточно ядер, обычно это лучший выбор для небольших куч.   -  person Alexey Ragozin    schedule 29.09.2017
comment
@AlexeyRagozin Мы вообще не хотим STW (кроме секунд 0.x). Если настройка CMS не помогает, возможно, мы будем модифицировать код.   -  person ntysdd    schedule 29.09.2017
comment
если все, что вам нужно, это паузы в доли секунды и иметь кучу размером 4 ГБ, тогда параллельный сборщик должен быть в состоянии сделать это, предполагая, что у вас достаточно ядер, а не чрезвычайно тяжелая рабочая нагрузка.   -  person the8472    schedule 29.09.2017


Ответы (1)


Старое поколение 4 Гб. происходит сбой параллельного режима (занимает около 15 секунд).

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

Итак, мы используем большое молодое поколение, 2 ГБ.

Это сравнительно много, учитывая общий размер кучи 4 ГБ, вы должны уменьшить молодое поколение, чтобы у старого поколения было больше, чем эти 30% передышки.

Каждые несколько часов запускается CMS.

Тогда вы могли бы позволить себе запускать его чаще, уменьшив IHOP.

person the8472    schedule 28.09.2017
comment
CMS не является уплотняющим сборщиком. Не будет ли это фрагментировать кучу и вызвать STW, если я позволю короткоживущим объектам слишком легко попасть в постоянное пространство? - person ntysdd; 29.09.2017
comment
возможно, больше фрагментации, но и больше места для борьбы с ней - person the8472; 29.09.2017