Como especificar o tamanho máximo da pilha da JVM "-xmx" para executar um aplicativo com ação "Run" no SBT?
Pergunta
Meu aplicativo faz grandes matrizes de dados processando e precisa de mais memória do que a JVM fornece por padrão. Eu sei que em Java é especificado pela opção "-xmx". Como faço para configurar o SBT para usar o valor "-xmx" específico para executar um aplicativo com ação "Run"?
Solução
Experimente isso:
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)
})
}
Outras dicas
Para processos bifurcados, você deve procurar Build.scala
Para modificar as opções Java para processos bifurcados, você precisa especificá -los no Build.scala (ou o que você nomeou sua construção) como este:
val buildSettings = Defaults.defaultSettings ++ Seq(
//…
javaOptions += "-Xmx1G",
//…
)
Isso lhe dará as opções adequadas sem modificar Java_Opts globalmente, e ele colocará Java_Opts personalizados em um SBT gerou Start-Script
Por não bifurcado processos é mais conveniente definir a configuração via sbtopts
ou sbtconfig
dependendo da sua versão SBT.
Desde SBT 0.13.6 .sbtconfig
é preterido. Modificar /usr/local/etc/sbtopts
ao longo destas linhas:
-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
Você também pode criar um .sbtopts
arquivo na raiz do seu projeto SBT usando a mesma sintaxe que no /usr/local/etc/sbtopts
Arquivo. Isso torna o projeto independente.
Antes do SBT 0.13.6 você pode definir as opções em .sbtConfig para não bifurcado processos:
Verifique onde está o SBT:
$ which sbt /usr/local/bin/sbt
Veja o conteúdo:
$ 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 "$@"
Defina as opções de JVM corretas para impedir a OOM (regular e Permgen):
$ cat ~/.sbtconfig SBT_OPTS="-Xms512M -Xmx3536M -Xss1M -XX:+CMSClassUnloadingEnabled -XX:+UseConcMarkSweepGC -XX:MaxPermSize=724M"
Se você deseja definir SBT_OPTS apenas para a execução atual do SBT, você pode usar env SBT_OPTS=".." sbt
Conforme sugerido por Googol Shan. Ou você pode usar a opção adicionada no SBT 12: sbt -mem 2048
. Isso fica pesado para listas mais longas de opções, mas pode ajudar se você tiver projetos diferentes com necessidades diferentes.
Observe que o CMSCLassunLoadingEnableded em conjunto com o USECONCMARKSWEEPGC ajuda a manter o espaço permgen limpo, mas, dependendo das estruturas que você usar, você pode ter um vazamento real no Permgen, o que eventualmente force uma reinicialização.
Na versão 12 do SBT, há uma opção para isso:
$sbt -mem 2048
Se você executar o SBT no Linux Shell, poderá usar:
env JAVA_OPTS="-Xmx512m" sbt run
Este é o meu comando geralmente usado para executar meu projeto SBT.
.sbtconfig
está preterido começando com o SBT 0.13.6
. Em vez disso, eu configurei essas opções em /usr/local/etc/sbtopts
Da seguinte maneira:
-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
Use Java_OPTS para definir com variável de ambiente.
Use opções -jx para SBT para opções individuais, por exemplo, -j -xmx2048 -j -xx: maxpermsize = 512
As versões mais recentes do SBT têm uma opção "-mem".
Há uma maneira de conhecer. Defina a variável de ambiente Java_OPTS.
JAVA_OPTS='-Xmx512m'
Não encontrei uma maneira de fazer isso como um parâmetro de comando.
o javaOptions += "-XX:MaxPermSize=1024"
Em nossa compilação.sbt, conforme mencionado por @iwein acima, funcionou para nós quando estávamos vendo um java.lang.outOfMemoryError jogado ao executar testes de especificações2 através do SBT.
A variável de ambiente é _java_options, que precisa ser definida. Depois de definir _java_options e quando você SBT, o SBT mostrará a mensagem usando Java_Options e os valores.
Como alternativa, você pode definir o JavaOption no arquivo sbt ou .scala, por exemplo
javaOptions += "-Xmx1G"
No shell sbt, você pode executar o show javaoptions para ver os valores definidos.
javaOptions in Test += "-Xmx1G"
Isso define as opções de JVM para testes. Funciona também com forking de JVM (fork in Test := true
).
O SBT permite listar as opções de JVM que você precisa para executar seu projeto em um arquivo nomeado
.jvmopts
na raiz do seu projeto. Em seguida, adicione as opções Java que você deseja
cat .jvmopts
-Xms512M
-Xmx4096M
-Xss2M
-XX:MaxMetaspaceSize=1024M
É testado e funciona no Windows 10https://www.lagomframework.com/documentation/1.4.x/scala/jvmmemoryondev.html