¿Cómo configurar el tamaño del montón para sbt?

90

Estoy usando SBT 0.12.0. He leído otras respuestas en el desbordamiento de pila y las seguí, sin embargo, ninguna de ellas ayuda, por ejemplo:

  • crear ForkRunclase: no he observado ningún proceso bifurcado durante mi uso de sbt
  • establecer la variable de entorno JAVA_OPTS: está establecida, pero la línea de comando de proceso de sbt no parece usarla en absoluto.
  • sbt -J-Xmx2Gagrega el parámetro a la línea de comando del proceso sbt, sin embargo, -Xmx1536msbt usa el valor anterior en lugar del parámetro agregado.

¿Me estoy perdiendo de algo? ¿Cómo configuro el tamaño del montón para sbt 0.12, al realizar tanto pruebas como run?

Spydon
fuente
9
¿Ha probado el memparámetro al iniciar sbt? (p sbt -mem2000. ej. )
om-nom-nom
2
Es posible que tenga un error tipográfico, debería ser JAVA_OPTS no JAVA_OPS
Noah
Mira mi respuesta a un duplicado de esta pregunta. stackoverflow.com/questions/3868863/… la respuesta marcada allí es incorrecta, pero la mía funciona (a veces también es necesario verificar los comentarios / votos :)
iwein

Respuestas:

101

Necesitas SBT_OPTS, esto es lo que uso en mi .bash_profile :

export SBT_OPTS="-Xmx1536M -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=2G -Xss2M  -Duser.timezone=GMT"

ACTUALIZACIÓN: Para obtener su espacio de pila 2G, puede usar esto:

export SBT_OPTS="-Xmx2G -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=2G -Xss2M  -Duser.timezone=GMT"

NOTA: SBT DEBE SER LA ÚLTIMA VERSIÓN

Las versiones anteriores de sbtcontienen errores que anulan estas configuraciones, use la brew upgrade sbtúltima sbtpara Mac (asumiendo la instalación de brew) (IDK para Linux). https://github.com/sbt/sbt/issues/2945#issuecomment-277490848

Noé
fuente
1
Gracias. De hecho, cambia la línea de comando del proceso sbt como se esperaba, sin embargo, el antiguo -Xmx1546mtodavía existe en la línea de comando y el tamaño máximo del montón todavía está limitado a 1,5 GB, como se muestra en visualvm.
1
¿Alguna forma de establecer esta configuración de entorno en la configuración SBT que está controlada por fuente?
Kevin Meredith
Eche un vistazo a la fuente de scalaz, tienen un archivo bash llamado sbt que carga todo lo que necesitan, también conocido como github.com/scalaz/scalaz/blob/series/7.2.x/sbt
Noah
4
Recibo una advertencia:Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=4G; support was removed in 8.0
samthebest
1
@samthebest Perm Gen se eliminó básicamente en Java 8, por lo que no es necesario incluirlo.
Noah
65

A partir de marzo de 2015, si está utilizando sbt en OSX con Homebrew , debe editar el archivo/usr/local/etc/sbtopts

p.ej

# set memory options
#
#-mem   <integer>
-mem 2048
Synesso
fuente
5
Esto también parece funcionar bien para Windows, en lugar de tener que jugar con las variables env (el archivo se encuentra en c: \ program files \ sbt \ confs).
Luciano
2
En Linux está en /etc/sbt-launcher-packaging.
Robin Green
1
En Ubuntu Artful, lo encontré en/etc/sbt/sbtopts
Synesso
Esta solución hará que la JVM preasigne toda la memoria de 2GB. Si utiliza SBT_OPTS=-Xmx2G sbtpara iniciar SBT, aumentará el montón según sea necesario hasta un máximo de 2 GB.
mgd
Eche un vistazo a la solución de @mike anterior: stackoverflow.com/a/55706960/1199564
mgd
42

"sbt -mem 23000 run" funciona para mí.

GBY
fuente
6
eso es 23Gb ¿no?
Ben Hutchison
1
@BenHutchison esto es probablemente envoltorio de SBT paulp, no el SBT original es que
matanster
19

He encontrado la solución. No importa cómo especifique el tamaño del montón de JVM, nunca funcionará porque el ejecutable SBT ya lo tiene anulado.

Hay una línea en el ejecutable SBT que dice:

. /usr/share/sbt/sbt-launch-lib.bash

Entonces edité el archivo:

  # run sbt
  execRunner "$java_cmd" \
    ${SBT_OPTS:-$default_sbt_opts} \
-   $(get_mem_opts $sbt_mem) \
    ${java_opts} \
    ${java_args[@]} \
    -jar "$sbt_jar" \
    "${sbt_commands[@]}" \
    "${residual_args[@]}"

Quita la -línea.

Ahora, cuando ejecute SBT, ya no anulará la configuración del tamaño del montón de JVM. Puede especificar la configuración del tamaño del montón usando la respuesta de @ Noan.

O alternativamente:

sbt -J-Xmx4G -J-Xms4G


fuente
3
En realidad, parece que export SBT_OPTS="..."en ~/.sbtconfighace el trabajo hecho.
Erik Kaplun
15

En Windows, para sbt 0.13.9.2, debe establecer JAVA_OPTSlas opciones de jvm que desee.

> set JAVA_OPTS=-Xmx1G
> sbt assembly

El sbt.batscript carga sus valores predeterminados desde conf\sbtconfig.txtdentro, CFG_OPTSpero los usará en su JAVA_OPTSlugar si está configurado.

Extractos relevantes de sbt.bat:

rem FIRST we load the config file of extra options.
set FN=%SBT_HOME%\..\conf\sbtconfig.txt
set CFG_OPTS=
FOR /F "tokens=* eol=# usebackq delims=" %%i IN ("%FN%") DO (
  set DO_NOT_REUSE_ME=%%i
  rem ZOMG (Part #2) WE use !! here to delay the expansion of
  rem CFG_OPTS, otherwise it remains "" for this loop.
  set CFG_OPTS=!CFG_OPTS! !DO_NOT_REUSE_ME!
)

. . . (saltar). . .

rem We use the value of the JAVA_OPTS environment variable if defined, rather than the config.
set _JAVA_OPTS=%JAVA_OPTS%
if "%_JAVA_OPTS%"=="" set _JAVA_OPTS=%CFG_OPTS%
:run
"%_JAVACMD%" %_JAVA_OPTS% %SBT_OPTS% -cp "%SBT_HOME%sbt-launch.jar" xsbt.boot.Boot %*
choy
fuente
11

Estaba buscando resolver un problema como este en Mac OS X con una instalación casera de SBT. Si instaló SBT a través de homebrew, está libre ya que el /usr/local/bin/sbtarchivo se ve así

#!/bin/sh
test -f ~/.sbtconfig && . ~/.sbtconfig
exec java -Xmx512M ${SBT_OPTS} -jar /usr/local/Cellar/sbt/0.12.3/libexec/sbt-launch.jar "$@"

Esto significa que cualquier configuración que SBT_OPTSingrese se mantendrá (su -Xmx tendrá prioridad). Además, la primera línea del script ejecutará cualquier comando ~/.sbtconfigsi existe, por lo que puede ser un mejor lugar para colocar sus opciones SBT si está jugando bastante con ellas. No tendrá que hacerlo source ~/.bash_profilecada vez que haga un cambio enSBT_OPTS

Adrián Rodríguez
fuente
2
si. Esto es lo que tengo en $ HOME / .sbtconfig. export SBT_OPTS = "- XX: MaxPermSize = 512M -Xmx2G -Xms64M" y cuando inicio sbt, hago un ps aux y muestra / usr / bin / java -Xmx512M -XX: MaxPermSize = 512M -Xmx2G -Xms64M -jar / usr / local / Cellar / sbt / 0.13.0 / libexec / sbt-launch.jar
Adrian Rodríguez
Sin embargo, acabo de ver la respuesta a continuación y quizás ese lanzador sea para otro tipo de configuración. Mi configuración es específica para Mac que usa el paquete homebrew.
Adrián Rodríguez
2
Homebrew SBT ahora requiere que el tamaño del montón se configure con el -memparámetro en/usr/local/etc/sbtopts
Synesso
6

Si ejecuta sbt desde PowerShell, configure la SBT_OPTsvariable de entorno, así:

$env:SBT_OPTS="-Xms512M -Xmx1024M -Xss2M -XX:MaxMetaspaceSize=1024M"

Entonces corre:

sbt
cantando
fuente
6

Para SBT versión 1.0.4 en Windows, la configuración predeterminada de JVM proviene delsbt\conf\sbtconfig.txt archivo. Simplemente edite los valores aquí. Cambiar -Xmx512Ma -Xmx2048M.

Esta no es la única fuente de opciones de JVM para SBT. Otros se pueden encontrar inspeccionando sbt.bat. Una forma sencilla de diagnosticar, donde hacer los ajustes vienen, es comentando esta línea en el archivo por lotes: @echo off.

Jarekczek
fuente
Nota: esto no sbt\confse coloca en el directorio de usuario, sino en la carpeta Archivos de programa, como C:\Program Files (x86)\sbt\conf.
Suma
5

Una forma rápida de hacerlo es con un .jvmoptsarchivo en la raíz de su proyecto (de la documentación de Lagom Framework ):

 $ cat .jvmopts
 -Xms512M
 -Xmx4096M
 -Xss2M
 -XX:MaxMetaspaceSize=1024M
Miguel
fuente
1
Esta debe estar marcada como la respuesta correcta, ya que también permite la configuración por proyecto.
mgd