Как указать максимальный размер кучи 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.