Проблема такая.
Мы используем CMS и испытываем сбой в параллельном режиме (занимает около 15 секунд). Использование JRE 8.
Уже используются UseCMSInitiatingOccupancyOnly и CMSInitiatingOccupancyFraction (80%). Не использовать CMSScavengeBeforeRemark.
Схема распределения такова:
Выделено много короткоживущих объектов. Итак, мы используем большое молодое поколение, 2 ГБ. Пространство выжившего не настроено. MaxTenuringThreshold установлен на 15. CMS срабатывает каждые несколько часов.
Старое поколение 4 Гб. Использование памяти высокое. После каждой коллекции у старого поколения остается около 30% свободного места. К сожалению, памяти больше нет. Мы планируем изменить программу, чтобы она использовала меньше памяти, но это требует времени.
Обычно у программы не так много работы, но каждые несколько часов (мы не можем предсказать, когда) мы очень заняты. А 15-секундный STW — это слишком долго.
Итак, мой вопрос:
Как мы можем настроить CMS для нашей программы?
Должен ли я увеличивать старое поколение (и уменьшать молодое)?
Должен ли я настроить Survivor?
Должен ли я изменить CMSInitiatingOccupancyFraction?
Поможет ли G1GC?