Opções de inicialização JVM

O Protector4J permite fixar as opções de inicialização da JVM no empacotamento, acrescentá-las temporariamente depois da implantação ou editar diretamente os scripts de inicialização gerados. As demais opções avançadas da interface gráfica estão descritas em Configurações do modo avançado do Protector4J.

1. Quatro maneiras de defini-las

MétodoAlcanceSobrevive a um novo empacotamentoMais indicado para
Opções de inicialização JVM na interface gráficaOs scripts de inicialização gerados para todas as plataformas nesta execuçãoSim, enquanto você tiver as configurações da tarefaEmpacotamento interativo do dia a dia
--jvm-option na linha de comandoOs scripts de inicialização gerados para todas as plataformas nesta execuçãoSim; o comando ou o arquivo de tarefa é a fonte de referênciaCI/CD e compilações reproduzíveis
Editar run.sh, run.bat ou os scripts do TomcatSomente a pasta implantada que você editouNão; empacotar de novo sobrescreveAjustes urgentes ou específicos de um ambiente após a implantação
Variável de ambiente APP_JAVA_OPTSSomente o processo ou o ambiente atualNada é gravado em discoDiagnóstico pontual e injeção a partir de um contêiner ou serviço

Guarde as opções duradouras na tarefa da interface gráfica ou no comando, e reserve APP_JAVA_OPTS para substituições pontuais. Se editar um script gerado, anote a mudança na sua documentação de implantação: será preciso reaplicá-la no próximo empacotamento.

2. Definir pela interface gráfica

  1. Na página de entrada, escolha Avançado — personalize você mesmo as opções. Vindo do modo simples, clique em Personalizar... na página final para chegar às opções avançadas.
  2. Em Opções comuns, localize Opções de inicialização JVM.
  3. Digite uma opção completa por linha, por exemplo:
-Xms512m
-Xmx2g
-Dfile.encoding=UTF-8
-Dspring.profiles.active=prod
  1. Confira-as no resumo final e execute a proteção.

As opções são gravadas nos run.sh e run.bat gerados. No macOS, o run.command chama o mesmo run.sh e usa, portanto, as mesmas opções. No Tomcat, elas também entram nos caminhos de inicialização de bin/catalina.sh e bin/catalina.bat. A criptografia de bibliotecas gera apenas um arquivo, sem scripts de inicialização, então o campo fica desativado.

Opções de inicialização JVM na interface gráfica

3. Definir pela linha de comando

Repita --jvm-option uma vez por opção. Não junte várias opções da JVM num mesmo valor.

p4j javaapp app.jar dist \
  --jvm-option -Xms512m \
  --jvm-option -Xmx2g \
  --jvm-option -Dfile.encoding=UTF-8

Para Spring Boot:

p4j springboot app.jar dist \
  --jvm-option -Xms1g \
  --jvm-option -Xmx2g

Para Tomcat:

p4j tomcat app.war dist \
  --context /app \
  --jvm-option -Xms1g \
  --jvm-option -Xmx2g

Coloque entre aspas toda opção que contenha espaços ou caracteres especiais:

--jvm-option '-Dexample.message=hello world'

O empacotador escapa cada opção separadamente para scripts de shell e de lote, respeitando esses limites.

4. Editar os scripts no macOS e no Linux

Em aplicativos Java comuns e Spring Boot, edite o run.sh da pasta de saída. O run.command apenas repassa para o run.sh, então não há nada a mudar nele.

Localize a linha gerada JVM_OPTS=(...) e as eventuais JVM_OPTS+=(...) seguintes, e acrescente a sua própria linha antes da verificação de APP_JAVA_OPTS.

JVM_OPTS+=("-Xms512m" "-Xmx2g" "-Dfile.encoding=UTF-8")
if [ -n "${APP_JAVA_OPTS:-}" ]; then
  # ...
fi

Não remova as opções --add-opens, --module-path ou --add-modules que o empacotador gerou para o Spring Boot ou o JavaFX.

No Tomcat, edite bin/catalina.sh e acrescente a sua linha depois de JVM_OPTS=(...) dentro de run_java().

run_java() {
  JVM_OPTS=(...)
  JVM_OPTS+=("-Xms1g" "-Xmx2g")
  # ...
}

Isso cobre tanto a execução em primeiro plano pelo run.sh quanto a inicialização em segundo plano por bin/startup.sh.

5. Editar os scripts no Windows

Em aplicativos Java comuns e Spring Boot, edite o run.bat da pasta de saída. Localize a linha gerada set "JVM_OPTS=..." e acrescente a sua antes da verificação de APP_JAVA_OPTS:

set "JVM_OPTS=%JVM_OPTS% -Xms512m -Xmx2g -Dfile.encoding=UTF-8"
if defined APP_JAVA_OPTS set "JVM_OPTS=%JVM_OPTS% %APP_JAVA_OPTS%"

Preserve o conteúdo já existente de JVM_OPTS. Não remova as opções internas de que o Spring Boot ou o JavaFX precisam.

Tomcat em primeiro plano no Windows

Edite bin\catalina.bat e acrescente a sua linha depois do set "JVM_OPTS=..." existente:

set "JVM_OPTS=%JVM_OPTS% -Xms1g -Xmx2g"

Vale para run.bat e para bin\catalina.bat run.

Tomcat em segundo plano no Windows

O bin\startup.bat cria o processo em segundo plano via PowerShell. A forma mais simples de mudar isso em definitivo é definir APP_JAVA_OPTS antes da chamada a catalina.bat:

@echo off
set "APP_JAVA_OPTS=-Xms1g -Xmx2g"
call "%~dp0catalina.bat" start %*
exit /b %ERRORLEVEL%

Se quiser cobrir primeiro e segundo plano sem manter dois scripts, é mais prático gerar de novo o pacote do Tomcat com --jvm-option pela interface ou pela linha de comando.

6. Usar APP_JAVA_OPTS numa única execução

macOS e Linux

APP_JAVA_OPTS="-Xms512m -Xmx2g" ./run.sh

Para Tomcat:

APP_JAVA_OPTS="-Xms1g -Xmx2g" ./bin/startup.sh

CMD do Windows

Defina-a para a sessão atual do CMD. Os comandos seguintes a herdam; limpe-a com set APP_JAVA_OPTS=.

set "APP_JAVA_OPTS=-Xms512m -Xmx2g"
run.bat

Para limitá-la e restaurar o ambiente depois:

setlocal
set "APP_JAVA_OPTS=-Xms512m -Xmx2g"
call run.bat
endlocal

Para Tomcat:

set "APP_JAVA_OPTS=-Xms1g -Xmx2g"
bin\startup.bat

PowerShell do Windows

$env:APP_JAVA_OPTS = '-Xms512m -Xmx2g'
.\run.bat
Remove-Item Env:APP_JAVA_OPTS

7. Ordem e ressalvas

  • Primeiro vêm as opções geradas pela ferramenta, depois as definidas na interface ou na linha de comando, e APP_JAVA_OPTS é acrescentada por último.
  • Em algumas opções da JVM um valor posterior sobrepõe o anterior, mas nem todas podem ser repetidas com segurança: não conte com a repetição para sobrescrever.
  • APP_JAVA_OPTS é separada por espaços, então não consegue levar uma única opção que os contenha. Nesses casos, use a interface, --jvm-option ou edite o vetor dentro do script.
  • As opções da JVM vêm antes da classe principal ou de -jar; os argumentos do aplicativo vêm depois do comando run.sh ou run.bat.
  • Depois de mudar o tamanho da memória, confira o valor junto ao limite do contêiner, à memória disponível do host e à sua carga real.
  • Empacotar de novo sobrescreve os scripts de inicialização, e as alterações manuais não são reincorporadas automaticamente.