Як вказати максимальний розмір купи JVM “-Xmx” для запуску програми з дією “run” у SBT?


97

Моя програма виконує обробку великих масивів даних і потребує більше пам'яті, ніж JVM надає за замовчуванням. Я знаю, що в Java це вказано опцією "-Xmx". Як встановити SBT для використання конкретного значення "-Xmx" для запуску програми з дією "run"?

Відповіді:


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 вміст моєї публікації здається вам дуже важливим.
Арн

2
Зауважте, що javaOptionsце діє лише для роздвоєних СП (див. Scala-sbt.org/0.13/docs/Forking.html )
Яр

1
Додати fork in run := ture дозволяєjavaOptions
coanor

@coanor ця відповідь на давню версію sbt. Є відповідь із набагато вищим рейтингом саме під цим. Ця відповідь була правильною у той час, коли було задано питання.
Арне

113

Для роздвоєних процесів слід переглянути Build.scala

Щоб змінити параметри Java для роздвоєних процесів, потрібно вказати їх у Build.scala (або тому, що ви назвали своєю збіркою) так:

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

Це дасть вам належні параметри, не змінюючи JAVA_OPTS у всьому світі, а також додасть власні JAVA_OPTS у стартовий сценарій, створений sbt

Для нерозгалужених процесів найзручніше встановлювати конфігурацію через вашу версію sbt sbtoptsабо sbtconfigзалежно від неї.

Оскільки 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. Якісь покажчики?
Ананд

@ І, можливо, в 0,13 все працює трохи інакше? Я оновлю відповідь, якщо я натрапляю на що-небудь (це може зайняти деякий час), дайте мені знати, якщо ви зрозумієте це в середній час.
iwein

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

2
FYI, ви також можете створити .sbtoptsфайл у кореневій частині вашого проекту SBT, використовуючи той самий синтаксис, що і у /usr/local/etc/sbtoptsфайлі. Це робить ваш проект самодостатнім, що може бути дуже зручним у ситуаціях ІР.
Вік Муїй

У Windows з використанням 0,13,9 (можливо 0,13,6) файл - це C: \ Program Files (x86) \ sbt \ conf \ sbtconfig.txt. За замовчуванням у файлі було "-Xmx512M" без -J, показаного у цій відповіді. Я можу підтвердити, що цей файл читається тим, що збірка sbt видає попередження щодо -XX: MaxPermSize, і коли я змінюю це значення, попередження показує значення, яке я ввів, а не значення "256м", яке воно показало спочатку.
Сова


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

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дещо низький для великих класів кейсів, 4М здається безпечнішим.
Marius Soutier

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.