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


98

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

Ответы:


17

Попробуй это:

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)
    })
}

53
Это устарело, теперь вы можете использоватьjavaOptions += "-Xmx1G"
— iwein

1
@iwein, содержание моего сообщения кажется вам очень важным.
— Arne

2
Обратите внимание, что javaOptionsдействует только на разветвленные JVM (см. Scala-sbt.org/0.13/docs/Forking.html )
— Яр

1
Добавить fork in run := ture включаетjavaOptions
— coanor

@coanor этот ответ предназначен для древней версии sbt. Непосредственно под этим есть ответ с гораздо более высоким рейтингом. Этот ответ был правильным на тот момент, когда задавался вопрос.
— Arne

113

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

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

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

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

Для не разветвленных процессов удобнее всего настроить конфигурацию через 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 для не разветвленных процессов:

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

    $ which sbt
    /usr/local/bin/sbt
    
  2. Посмотрите на содержание:

    $ 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 "$@"
    
  3. Установите правильные параметры 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, что в конечном итоге приведет к перезагрузке.


@iwein - javaOptions не изменяет пространство кучи по умолчанию для sbt. Я проверил в jconsole, и он просто показывает -Xmx512M. Даже если я добавлю SBT_OPTS в ~ / .sbtconfig, я все равно получу это в jconsole: -Xmx512M -Xms256M -Xmx1G -XX: MaxPermSize = 256M -XX: + UseConcMarkSweepGC. Вы видите Xmx512 спереди? Каким-то образом он не выбирает javaOptions из Build.scala. Есть указатели?
— Ананд

@An и, может быть, в 0.13 все работает немного иначе? Я обновлю ответ, если столкнусь с чем-либо (это может занять некоторое время), дайте мне знать, если вы разберетесь в этом за время.
— iwein

@iwein Я просто использовал следующее в моем Build.scala, и это сработало. fork in run: = true, javaOptions in run ++ = Seq ("- Xms256m", "-Xmx2048m", "-XX: + UseConcMarkSweepGC"). См. Этот пост для ответа stackoverflow.com/questions/27372468/… . Спасибо!
— Ананд

2
К вашему сведению, вы также можете создать .sbtoptsфайл в корне вашего проекта SBT, используя тот же синтаксис, что и в /usr/local/etc/sbtoptsфайле. Это делает ваш проект автономным, что может быть очень удобно в ситуациях CI.
— Age Mooij

В Windows с использованием версии 0.13.9 (может быть 0.13.6) это файл C: \ Program Files (x86) \ sbt \ conf \ sbtconfig.txt. По умолчанию в файле было "-Xmx512M" без -J, показанного в этом ответе. Я могу подтвердить, что этот файл читается, по тому факту, что сборка sbt выдает предупреждение относительно -XX: MaxPermSize, и когда я меняю это значение, в предупреждении отображается введенное мной значение, а не значение «256 м», которое оно показывало изначально.
— Night Owl


43

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

env JAVA_OPTS="-Xmx512m" sbt run

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


1
Большое спасибо. Классная команда, которую нужно знать. Я никогда не знал об этом "env" и много раз упускал такой инструмент.
— Иван

4
Хм, у меня это не сработало! Мне нужно override def forkрешение выше. (sbt 0.7.7)
— Скотт Моррисон

2
возможно, что ваш файл sbt указывает свой собственный JAVA_OPTS, и в этом случае они будут перезаписаны. Затем вы можете просто изменить свой sbt-файл, чтобы удалить флаг -Xmx или переключить его на желаемый максимальный размер кучи.
— nnythm 01

23

.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

1
-J-Xss1Mнемного мала для больших классов корпусов, 4M кажется более безопасным.
— Мариус Сутье,

7

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

JAVA_OPTS='-Xmx512m'

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


7

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

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

В более новых версиях sbt есть опция «-mem».


5

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


1
@UwePlonus отвечает на вопрос.
— VasiliNovikov

3

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

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

javaOptions += "-Xmx1G"

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


1
    javaOptions in Test += "-Xmx1G"

Это устанавливает параметры JVM для тестов. Также работает с jvm forking ( fork in Test := true).


1
где это установлено в build.sbt?
— javadba

Куда угодно, если у вас проект из 1 модуля. Порядок определений обычно не имеет значения в SBT. Если у вас несколько модулей, укажите это либо на некоторых из них, либо, если хотите, глобально через javaOptions in ThisBuild += "-Xmx1G"илиjavaOptions in (ThisBuild, Test) += "-Xmx1G"
— VasiliNovikov

1

sbt позволяет вам перечислить параметры JVM, необходимые для запуска вашего проекта в файле с именем

.jvmopts

в корне вашего проекта. затем добавьте нужные параметры Java

cat .jvmopts
-Xms512M
-Xmx4096M
-Xss2M
-XX:MaxMetaspaceSize=1024M

он протестирован и работает в windows 10 https://www.lagomframework.com/documentation/1.4.x/scala/JVMMemoryOnDev.html

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.