Руководство по параметрам jvm в идиоматическом scala

Хорошо, я понимаю, что я должен сравнить свое конкретное приложение и бла-бла-бла, но:

Настройки JVM по умолчанию для -Xmx, сборщика мусора по умолчанию и т.д. являются значениями по умолчанию, которые являются разумными значениями по умолчанию для большинства типичных программ Java, и могут быть не такими подходящими для идиоматического кода Scala (частично потому, что идиоматический Scala будет иметь тенденцию генерировать больше "мусора" ).

Итак, я ищу рекомендации для вариантов. Требуется ли типичная Scala программа с более высоким значением -Xmx? Являются ли определенные JVM лучше для Scala, чем другие? Является ли другой сборщик мусора (-XX: + UseParallelGC vs XX: + UseConcMarkSweepGC), как правило, более безопасным/лучшим/быстрым догадкой/ставкой/значением по умолчанию для Scala, чем обычно используется в Java? Есть ли другие варианты, о которых я должен думать конкретно в отношении кода Scala и каким образом?

Так как генерируются более временные объекты, должно ли больше по умолчанию выделяться больше "молодого" поколения? Или, как правило, молодому поколению требуется меньше пространства для более частого сбора мусора? Как насчет других поколений?

Конечно, мне все равно нужно настроить эти вещи для моего конкретного приложения, но, как правило, я предполагаю, что для типичной программы Scala моя стартовая точка может отличаться от той, что есть на Java.

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

Ответ 1

Это происходит от пользователя scala, поэтому он основан исключительно на личном опыте. Вкратце: я, как правило, делаю довольно много оптимизации JVM, поскольку обнаружил, что небольшое усилие может дать вам долгий путь, но я не нашел ничего конкретного для scala.

По умолчанию значения JVM, как вы сказали, разумны. Установка правильного размера кучи, выбор правильного GC, использование VM сервера, размеров и т.д., Увеличивает производительность для приложений scala, насколько это возможно для простых приложений Java. Это не значит, что профили для java и scala идентичны, так что ваше фактическое приложение, вероятно, будет иметь гораздо больший эффект.

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

Ответ 2

Одна вещь, которую я нашел с оптимизацией настроек JVM и GC для Eclipse IDE - более крупные размеры, подразумевает большие паузы, когда они, наконец, собирают их.

Паузы, очевидно, являются большим раздражением для интерактивных приложений. Импликация здесь заключалась бы в использовании большого максимума, но не в силу большого минимума.

Я довольно сильно сравнил XX: + UseParallelGC с XX: + UseConcMarkSweepGC, но это было на предыдущем компьютере. Я закончил использование XX: + UseConcMarkSweepGC на этом компьютере (один процессор), но для многоядерной машины Parallel, по-видимому, подходит.

Большой интересный совет по настройке GC:

IIRC, я нашел "низкие значения" -XX: SurvivorRatio = 2 или -XX: SurvivorRatio = 3, чтобы предложить значительные преимущества в производительности. Все остальные варианты, которые я пробовал, не имели заметного эффекта.