¿Cómo especificar el tamaño de pila máximo de JVM "-Xmx" para ejecutar una aplicación con la acción "ejecutar" en SBT?

97

Mi aplicación procesa matrices de datos grandes y necesita más memoria que la que proporciona la JVM de forma predeterminada. Sé que en Java está especificado por la opción "-Xmx". ¿Cómo configuro SBT para usar un valor "-Xmx" particular para ejecutar una aplicación con la acción "ejecutar"?

Iván
fuente

Respuestas:

17

Prueba esto:

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)
    })
}
Arne
fuente
53
Esto está desactualizado, ahora puede usarlojavaOptions += "-Xmx1G"
iwein
1
@iwein, el contenido de mi publicación parece ser muy importante para ti.
Arne
2
Tenga en cuenta que javaOptionssólo tienen efecto para la JVM en horquilla (véase scala-sbt.org/0.13/docs/Forking.html )
Yar
1
Agregar fork in run := ture habilitacionesjavaOptions
coanor
@coanor esta respuesta es para una versión antigua de sbt. Hay una respuesta con clasificaciones mucho más altas justo debajo de esta. Esta respuesta fue la respuesta correcta en el momento en que se hizo la pregunta.
Arne
113

Para procesos bifurcados, debe mirar Build.scala

Para modificar las opciones de java para procesos bifurcados, debe especificarlas en Build.scala (o como sea que haya llamado su compilación) de esta manera:

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

Esto le dará las opciones adecuadas sin modificar JAVA_OPTS globalmente, y colocará JAVA_OPTS personalizado en un script de inicio generado por sbt

Para procesos no bifurcados , es más conveniente establecer la configuración a través de sbtoptso sbtconfigdependiendo de su versión de sbt.

Dado que sbt 0.13.6 .sbtconfigestá en desuso . Modifique /usr/local/etc/sbtoptssiguiendo estas líneas:

-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

También puede crear un .sbtoptsarchivo en la raíz de su proyecto SBT usando la misma sintaxis que en el /usr/local/etc/sbtoptsarchivo. Esto hace que el proyecto sea autónomo.

Antes de sbt 0.13.6 , podía configurar las opciones en .sbtconfig para procesos no bifurcados :

  1. Compruebe dónde está sbt:

    $ which sbt
    /usr/local/bin/sbt
  2. Mira el contenido:

    $ 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. Configure las opciones jvm correctas para prevenir OOM (tanto regular como PermGen):

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

Si desea configurar SBT_OPTS solo para la ejecución actual de sbt, puede usarlo env SBT_OPTS=".." sbtcomo lo sugiere Googol Shan. O puede utilizar la opción añadida en Sbt 12: sbt -mem 2048. Esto se vuelve difícil de manejar para listas de opciones más largas, pero podría ayudar si tiene diferentes proyectos con diferentes necesidades.

Tenga en cuenta que CMSClassUnloadingEnabled en conjunto con UseConcMarkSweepGC ayuda a mantener limpio el espacio de PermGen, pero dependiendo de los marcos que use, es posible que tenga una fuga real en PermGen, que eventualmente fuerza un reinicio.

iwein
fuente
@iwein: javaOptions no cambió el espacio de almacenamiento predeterminado para sbt. Revisé jconsole y solo muestra -Xmx512M. Incluso si agrego SBT_OPTS en ~ / .sbtconfig, todavía obtengo esto en jconsole: -Xmx512M -Xms256M -Xmx1G -XX: MaxPermSize = 256M -XX: + UseConcMarkSweepGC. ¿Ves el Xmx512 en el frente? De alguna manera, no elige las opciones java de Build.scala. ¿Algún consejo?
Anand
@ Ana ¿Y quizás las cosas están funcionando de manera ligeramente diferente en 0.13? Actualizaré la respuesta si me encuentro con algo (puede llevar un tiempo), avíseme si lo averigua mientras tanto.
iwein
@iwein Acabo de usar lo siguiente en mi Build.scala y funcionó. bifurcación en ejecución: = true, javaOptions en ejecución ++ = Seq ("- Xms256m", "-Xmx2048m", "-XX: + UseConcMarkSweepGC"). Consulte esta publicación para obtener la respuesta stackoverflow.com/questions/27372468/… . ¡Gracias!
Anand
2
Para su información, también puede crear un .sbtoptsarchivo en la raíz de su proyecto SBT utilizando la misma sintaxis que en el /usr/local/etc/sbtoptsarchivo. Esto hace que su proyecto sea autónomo, lo que puede ser muy útil en situaciones de CI.
Edad Mooij
En Windows con 0.13.9 (podría ser 0.13.6), el archivo es C: \ Archivos de programa (x86) \ sbt \ conf \ sbtconfig.txt. De forma predeterminada, el archivo tenía "-Xmx512M" sin el -J que se muestra en esta respuesta. Puedo confirmar que este archivo se está leyendo por el hecho de que el ensamblaje sbt emite una advertencia con respecto a -XX: MaxPermSize y cuando cambio ese valor, la advertencia muestra el valor que ingresé y no el valor de "256 m" que mostraba originalmente.
Night Owl
68

En sbt versión 12 en adelante, hay una opción para esto:

$sbt -mem 2048 
Prashant Sharma
fuente
5
en win 8.1, este comando no funcionó para mí:Not a valid command: mem (similar: set)
Kevin Meredith
43

Si ejecuta sbt en linux shell, puede usar:

env JAVA_OPTS="-Xmx512m" sbt run

Este es mi comando de uso habitual para ejecutar mi proyecto sbt.

Googol Shan
fuente
1
Muchas gracias. Un comando genial para saber. Nunca supe de ese "env" y extrañé tal herramienta muchas veces.
Ivan
4
¡Hmm, esto no funcionó para mí! Necesitaba la override def forksolución anterior. (sbt 0.7.7)
Scott Morrison
2
es posible que su archivo sbt especifique su propio JAVA_OPTS, en cuyo caso se sobrescribirán. Luego, puede modificar directamente su archivo sbt, ya sea para eliminar el indicador -Xmx o para cambiarlo al tamaño máximo de pila deseado.
nnythm
23

.sbtconfigestá en desuso a partir de SBT 0.13.6. En cambio, configuré estas opciones /usr/local/etc/sbtoptsde la siguiente manera:

-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
Om nom nom
fuente
1
-J-Xss1Mes un poco bajo para clases de casos grandes, 4M parece ser más seguro.
Marius Soutier
7

Hay una forma que conozco. Establezca la variable de entorno JAVA_OPTS.

JAVA_OPTS='-Xmx512m'

No he encontrado una manera de hacer esto como parámetro de comando.

Synesso
fuente
7

Utilice JAVA_OPTS para configurar con la variable de entorno.

Utilice las opciones -JX para sbt para opciones individuales, por ejemplo, -J-Xmx2048 -J-XX: MaxPermSize = 512

Las versiones más recientes de sbt tienen una opción "-mem".

Brett
fuente
5

El javaOptions += "-XX:MaxPermSize=1024"en nuestro build.sbt como lo hace referencia @iwein anteriormente funcionó para nosotros cuando veíamos un java.lang.OutOfMemoryError lanzado mientras ejecutamos pruebas Specs2 a través de sbt.

Pete Neisen
fuente
1
@UwePlonus responde la pregunta.
VasiliNovikov
3

La variable de entorno es _JAVA_OPTIONS, que debe configurarse. Una vez que establezca _JAVA_OPTIONS, y cuando sbt, sbt mostrará el mensaje usando JAVA_OPTIONS y los valores.

Alternativamente, puede configurar javaOption en el archivo sbt o .scala, por ejemplo

javaOptions += "-Xmx1G"

Desde el shell sbt, puede ejecutar show javaOptions para ver los valores establecidos.

Sajive Kumar
fuente
1
    javaOptions in Test += "-Xmx1G"

Esto establece las opciones de JVM para las pruebas. Funciona también con jvm forking ( fork in Test := true).

VasiliNovikov
fuente
1
¿Dónde está este conjunto en el build.sbt?
javadba
En cualquier lugar, si tiene un proyecto de 1 módulo. El orden de las definiciones generalmente no importa en SBT. Si tiene varios módulos, especifique esto en algunos de ellos o, si lo desea, globalmente a través de javaOptions in ThisBuild += "-Xmx1G"ojavaOptions in (ThisBuild, Test) += "-Xmx1G"
VasiliNovikov