Como definir o tamanho do heap para sbt?

88

Estou usando o SBT 0.12.0. Eu li outras respostas sobre estouro de pilha e as segui, porém nenhuma delas ajuda, por exemplo:

  • criar ForkRunclasse - não observei nenhum processo bifurcado durante meu uso do sbt
  • definir a variável de ambiente JAVA_OPTS- está definida, mas a linha de comando do processo sbt não parece usá-la.
  • sbt -J-Xmx2Ganexa o parâmetro à linha de comando do processo sbt, no entanto, o valor antigo -Xmx1536mé usado por sbt em vez do parâmetro anexado.

Estou esquecendo de algo? Como defino o tamanho do heap para sbt 0.12, ao fazer os testes e run?

espião
fonte
8
Você tentou o memparâmetro ao iniciar o sbt? (por exemplo sbt -mem2000)
om-nom-nom
2
Você pode ter um erro de digitação, deve ser JAVA_OPTS e não JAVA_OPS
Noah,
Verifique minha resposta a uma duplicata desta pergunta. stackoverflow.com/questions/3868863/… a resposta marcada está errada, mas a minha funciona (às vezes você precisa verificar os comentários / votos também :)
iwein

Respostas:

100

Você precisa SBT_OPTS, aqui está o que eu uso em meu .bash_profile :

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

ATUALIZAÇÃO: para obter seu espaço de heap 2G, você pode usar isto:

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

NOTA: SBT DEVE SER A VERSÃO MAIS RECENTE

Versões mais antigas do sbtcontêm bugs que substituem essas configurações, use brew upgrade sbtpara o mais recente sbtpara Mac (assumindo a instalação do brew) (IDK para Linux). https://github.com/sbt/sbt/issues/2945#issuecomment-277490848

Noé
fonte
1
Obrigado. Na verdade, ele altera a linha de comando do processo sbt conforme o esperado; no entanto, o antigo -Xmx1546mainda existe na linha de comando e o tamanho máximo do heap ainda é limitado a 1,5 GB, conforme mostrado no visualvm.
1
alguma maneira de definir essa configuração de ambiente na configuração do SBT que é controlada pela origem?
Kevin Meredith
Dê uma olhada na fonte do scalaz, eles têm um arquivo bash chamado sbt que carrega tudo o que precisam, também conhecido como github.com/scalaz/scalaz/blob/series/7.2.x/sbt
Noah
4
Recebo um aviso:Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=4G; support was removed in 8.0
samthebest
1
@samthebest Perm Gen foi basicamente removido do Java 8, portanto, não é necessário incluí-lo.
Noah
64

Em março de 2015, se você estiver usando sbt no OSX com Homebrew , você deve editar o arquivo/usr/local/etc/sbtopts

por exemplo

# set memory options
#
#-mem   <integer>
-mem 2048
Synesso
fonte
5
Isso também parece funcionar bem para o Windows, em vez de ter que mexer com as variáveis ​​env (o arquivo está em c: \ arquivos de programas \ sbt \ confs).
Luciano
2
No Linux está disponível /etc/sbt-launcher-packaging.
Robin Green,
1
No Ubuntu Artful, encontrei-o em/etc/sbt/sbtopts
Synesso de
Esta solução fará com que a JVM pré-aloque toda a memória de 2 GB. Se você usar SBT_OPTS=-Xmx2G sbtpara iniciar o SBT, ele aumentará o heap conforme necessário até um máximo de 2 GB.
mgd
Dê uma olhada na solução da @mike acima: stackoverflow.com/a/55706960/1199564
mgd
42

"sbt -mem 23000 run" funciona para mim.

GBY
fonte
6
isso é 23 GB, não é ..?
Ben Hutchison
1
@BenHutchison este é provavelmente o wrapper sbt de paulp, não o sbt original, é isso
matanster
19

Eu encontrei a solução. Não importa como você especifica o tamanho de heap da JVM, ele nunca funcionará porque o executável SBT já o substituiu.

Existe uma linha no executável SBT que diz:

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

Então, editei o arquivo:

  # 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[@]}"

Remova a -linha.

Agora, ao executar o SBT, ele não substituirá mais as configurações de tamanho de heap da JVM. Você pode especificar as configurações de tamanho de heap usando a resposta de @Noan.

Ou alternativamente:

sbt -J-Xmx4G -J-Xms4G


fonte
3
Na verdade, parece que export SBT_OPTS="..."no ~/.sbtconfigfunciona de fato.
Erik Kaplun
15

No Windows, para sbt 0.13.9.2, você precisa definir JAVA_OPTSas opções jvm desejadas.

> set JAVA_OPTS=-Xmx1G
> sbt assembly

O sbt.batscript carrega seus padrões de conf\sbtconfig.txtem, CFG_OPTSmas usará em seu JAVA_OPTSlugar se definido.

Trechos 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!
)

. . . (pular). . .

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
fonte
11

Eu estava tentando resolver um problema como esse no Mac OS X com uma instalação homebrew do SBT. Se você instalou o SBT via homebrew, está seguro, pois o /usr/local/bin/sbtarquivo parece

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

Isso significa que todas as configurações que você fizer SBT_OPTSserão mantidas (seu -Xmx terá precedência). Além disso, a primeira linha do script executará quaisquer comandos, ~/.sbtconfigse houver, então pode ser um lugar melhor para colocar suas opções de SBT se você estiver brincando um pouco com elas. Você não precisará fazer isso source ~/.bash_profiletoda vez que fizer uma mudança paraSBT_OPTS

Adrian Rodriguez
fonte
2
sim. Isso é o que tenho em $ HOME / .sbtconfig. export SBT_OPTS = "- XX: MaxPermSize = 512M -Xmx2G -Xms64M" e quando inicio o sbt, faço um ps aux e exibe / usr / bin / java -Xmx512M -XX: MaxPermSize = 512M -Xmx2G -Xms64M -jar / usr / local / Cellar / sbt / 0.13.0 / libexec / sbt-launch.jar
Adrian Rodriguez
No entanto, acabei de ver a resposta abaixo e talvez esse iniciador seja para outro tipo de configuração. Minha configuração é específica para Mac usando o pacote homebrew.
Adrian Rodriguez
2
O Homebrew SBT agora requer que o tamanho do heap seja configurado com o -memparâmetro em/usr/local/etc/sbtopts
Synesso
6

Se estiver executando sbt do PowerShell, defina a SBT_OPTsvariável de ambiente, assim:

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

Então corra:

sbt
sungiant
fonte
6

Para o SBT versão 1.0.4 no Windows, as configurações JVMsbt\conf\sbtconfig.txt padrão vêm do arquivo. Simplesmente edite os valores aqui. Mude -Xmx512Mpara -Xmx2048M.

Esta não é a única fonte de opções de JVM para SBT. Outros podem ser encontrados inspecionando sbt.bat. Uma simples maneira de diagnosticar, onde fazer as configurações vêm, é por comentar esta linha no arquivo de lote: @echo off.

Jarekczek
fonte
Nota: isso sbt\confnão é colocado no diretório do usuário, mas na pasta Arquivos de programas, como C:\Program Files (x86)\sbt\conf.
Suma
4

Uma maneira rápida de fazer isso é com um .jvmoptsarquivo na raiz do seu projeto (da documentação do Lagom Framework ):

 $ cat .jvmopts
 -Xms512M
 -Xmx4096M
 -Xss2M
 -XX:MaxMetaspaceSize=1024M
Mike
fonte
Essa deve ser marcada como a resposta correta, pois também permite configurações por projeto.
mgd