Как указать максимальный размер кучи JVM "-Xmx" для запуска приложения с действием "запустить" в SBT?

Мое приложение обрабатывает большие массивы данных и требует большего объема памяти, чем по умолчанию JVM. Я знаю, что в Java указан параметр "-Xmx". Как настроить SBT для использования определенного значения "-Xmx" для запуска приложения с действием "запустить"?

Ответ 1

Попробуйте следующее:

class ForkRun(info: ProjectInfo) extends DefaultProject(info) {
    override def fork = Some(new ForkScalaRun {
        override def runJVMOptions = super.runJVMOptions ++ Seq("-Xmx512m")
        override def scalaJars = Seq(buildLibraryJar.asFile, buildCompilerJar.asFile)
    })
}

Ответ 2

Для разветвленных процессов вы должны посмотреть Build.scala

Чтобы изменить параметры java для разветвленных процессов, вам нужно указать их в Build.scala(или как бы вы назвали вашу сборку) следующим образом:

val buildSettings = Defaults.defaultSettings ++ Seq(
   //…
   javaOptions += "-Xmx1G",
   //…
)

Это даст вам правильные варианты без изменения JAVA_OPTS по всему миру, и он добавит пользовательские JAVA_OPTS в sbt сгенерированный start- script

Для non forked процессов наиболее удобно устанавливать конфигурацию через sbtopts или sbtconfig в зависимости от вашей версии sbt.

Так как sbt 0.13.6 .sbtconfig устарел. Измените /usr/local/etc/sbtopts в следующих строках:

-J-Xms512M
-J-Xmx3536M
-J-Xss1M
-J-XX:+CMSClassUnloadingEnabled
-J-XX:+UseConcMarkSweepGC
-J-XX:MaxPermSize=724M
-J-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005

Вы также можете создать файл .sbtopts в корне вашего проекта SBT с использованием того же синтаксиса, что и в файле /usr/local/etc/sbtopts. Это делает проект самодостаточным.

До sbt 0.13.6 вы можете установить параметры в .sbtconfig для процессов без разветвления:

  • Проверьте, где находится sbt:

    $ which sbt
    /usr/local/bin/sbt
    
  • Посмотрите содержимое:

    $ cat /usr/local/bin/sbt
    #!/bin/sh
    test -f ~/.sbtconfig && . ~/.sbtconfig
    exec java ${SBT_OPTS} -jar /usr/local/Cellar/sbt/0.12.1/libexec/sbt-launch.jar "[email protected]"
    
  • Задайте правильные параметры jvm для предотвращения OOM (как обычных, так и PermGen):

    $ cat ~/.sbtconfig
    SBT_OPTS="-Xms512M -Xmx3536M -Xss1M 
     -XX:+CMSClassUnloadingEnabled 
     -XX:+UseConcMarkSweepGC -XX:MaxPermSize=724M"
    

Если вы хотите установить SBT_OPTS только для текущего запуска sbt, вы можете использовать env SBT_OPTS=".." sbt, как предложено Googol Shan. Или вы можете использовать опцию, добавленную в Sbt 12: sbt -mem 2048. Это становится громоздким для более длинных списков опций, но это может помочь, если у вас разные проекты с разными потребностями.

Обратите внимание, что CMSClassUnloadingEnabled совместно с UseConcMarkSweepGC помогает сохранить пространство PermGen в чистоте, но в зависимости от того, какие рамки вы используете, у вас может возникнуть настоящая утечка в PermGen, что в конечном итоге приведет к перезапуску.

Ответ 3

В sbt версии 12 и далее есть опция для этого:

$sbt -mem 2048 

Ответ 4

Если вы запустите sbt на оболочке linux, вы можете использовать:

env JAVA_OPTS="-Xmx512m" sbt run

Это моя обычно используемая команда для запуска моего проекта sbt.

Ответ 5

.sbtconfig устарел, начиная с SBT 0.13.6. Вместо этого я сконфигурировал эти параметры в /usr/local/etc/sbtopts следующим образом:

-J-Xms512M
-J-Xmx3536M
-J-Xss1M
-J-XX:+CMSClassUnloadingEnabled
-J-XX:+UseConcMarkSweepGC
-J-XX:MaxPermSize=724M
-J-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005

Ответ 6

Там один из способов, о котором я знаю. Установите переменную среды JAVA_OPTS.

JAVA_OPTS='-Xmx512m'

Я не нашел способ сделать это как параметр команды.

Ответ 7

Используйте JAVA_OPTS для установки с переменной окружения.

Используйте опции -J-X для sbt для отдельных параметров, например. -J-Xmx2048 -J-XX: MaxPermSize = 512

В новых версиях sbt есть опция "-mem".

Ответ 8

javaOptions += "-XX:MaxPermSize=1024" в нашем файле build.sbt, на который ссылается @iwein выше, работал для нас, когда мы видели java.lang.OutOfMemoryError, брошенную при запуске тестов Specs2 через sbt.

Ответ 9

Переменная среды - _JAVA_OPTIONS, которая должна быть установлена. После того, как вы установили _JAVA_OPTIONS, а когда вы sbt, sbt покажет сообщение с помощью JAVA_OPTIONS и значений.

В качестве альтернативы вы можете установить javaOption в файле sbt или .scala например,

javaOptions += "-Xmx1G"

Из оболочки sbt вы можете запустить show javaOptions, чтобы увидеть значения, которые установлены.

Ответ 10

    javaOptions in Test += "-Xmx1G"

Здесь задаются параметры JVM для тестов. Работает также с jvm forking (fork in Test := true).