Como especificar o tamanho máximo da pilha da JVM "-xmx" para executar um aplicativo com ação "Run" no SBT?

StackOverflow https://stackoverflow.com/questions/3868863

  •  28-09-2019
  •  | 
  •  

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"?

Foi útil?

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:

  1. Verifique onde está o SBT:

    $ which sbt
    /usr/local/bin/sbt
    
  2. 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 "$@"
    
  3. 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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top