Давным-давно я написал руководство по этой теме.Это все еще очень актуально.
Самое важное для сборщика мусора CMS при определении размеров.Кажется, что и ваше молодое, и старое пространство слишком мало.
Старое пространство должно быть размером вашего живого набора (~ размер кучи после полного GC), умноженным на определенный коэффициент.Фактор должен быть найден эмпирически, 1.5 - хорошая отправная точка.
Чем больше пространство для молодых, тем лучше, если вы хорошо справляетесь с молодыми паузами в GC.Размер молодости также очень эмпирический для каждого приложения.
-XX:InitiatingHeapOccupancyPercent=n
и -XX:+UseCMSInitiatingOccupancyOnly
рекомендуются для обеспечения своевременного запуска параллельного цикла.В некоторых ситуациях -XX:CMSTriggerInterval=p
также полезно.