Options de démarrage JVM

Protector4J permet de fixer les options de démarrage JVM lors de l'empaquetage, de les ajouter temporairement après le déploiement ou de modifier directement les scripts de démarrage produits. Les autres options avancées de l'interface graphique sont décrites dans Réglages du mode avancé de Protector4J.

1. Quatre façons de les définir

MéthodePortéeSurvit à un nouvel empaquetageConvient surtout à
Options de démarrage JVM dans l'interface graphiqueLes scripts de démarrage produits pour toutes les plates-formes lors de cette exécutionOui, tant que vous conservez les réglages de la tâcheL'empaquetage interactif au quotidien
--jvm-option en ligne de commandeLes scripts de démarrage produits pour toutes les plates-formes lors de cette exécutionOui ; la commande ou le fichier de tâche fait référenceL'intégration continue et les constructions reproductibles
Modifier run.sh, run.bat ou les scripts TomcatUniquement le répertoire déployé que vous avez modifiéNon ; un nouvel empaquetage l'écraseLes ajustements urgents ou propres à un environnement après déploiement
Variable d'environnement APP_JAVA_OPTSUniquement le processus ou l'environnement courantRien n'est écrit sur le disqueLe diagnostic ponctuel et l'injection depuis un conteneur ou un service

Gardez les options durables dans la tâche de l'interface graphique ou dans la commande, et réservez APP_JAVA_OPTS aux substitutions ponctuelles. Si vous modifiez directement un script produit, notez le changement dans votre documentation de déploiement : il faudra le réappliquer au prochain empaquetage.

2. Les définir dans l'interface graphique

  1. Sur la page d'entrée, choisissez Avancé — personnalisez les options vous-même. Depuis le mode simple, cliquez sur Personnaliser... sur la page finale pour atteindre les options avancées.
  2. Dans Options communes, repérez Options de démarrage JVM.
  3. Saisissez une option complète par ligne, par exemple :
-Xms512m
-Xmx2g
-Dfile.encoding=UTF-8
-Dspring.profiles.active=prod
  1. Vérifiez-les dans le récapitulatif final, puis lancez la protection.

Les options sont écrites dans les run.sh et run.bat produits. Sous macOS, run.command appelle le même run.sh et utilise donc les mêmes options. Pour Tomcat, elles figurent aussi sur les chemins de démarrage de bin/catalina.sh et bin/catalina.bat. Le chiffrement de la bibliothèque ne produit qu'une archive, sans script de démarrage : le champ y est désactivé.

Options de démarrage JVM dans l'interface graphique

3. Les définir en ligne de commande

Répétez --jvm-option une fois par option. Ne regroupez pas plusieurs options JVM dans une même valeur.

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

Pour Spring Boot :

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

Pour Tomcat :

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

Mettez entre guillemets toute option contenant des espaces ou des caractères spéciaux :

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

L'empaqueteur échappe chaque option séparément pour les scripts shell et les scripts de commandes, en respectant ces limites.

4. Modifier les scripts sous macOS et Linux

Pour les applications Java ordinaires et Spring Boot, modifiez run.sh dans le répertoire de sortie. run.command ne fait que déléguer à run.sh : rien à y changer.

Repérez la ligne produite JVM_OPTS=(...) et les éventuelles JVM_OPTS+=(...) qui suivent, puis ajoutez votre propre ligne avant le test sur APP_JAVA_OPTS.

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

Ne supprimez pas les options --add-opens, --module-path ou --add-modules que l'empaqueteur a générées pour Spring Boot ou JavaFX.

Pour Tomcat, modifiez bin/catalina.sh et ajoutez votre ligne après JVM_OPTS=(...) dans run_java().

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

Cela couvre aussi bien l'exécution au premier plan par run.sh que le démarrage en arrière-plan par bin/startup.sh.

5. Modifier les scripts sous Windows

Pour les applications Java ordinaires et Spring Boot, modifiez run.bat dans le répertoire de sortie. Repérez la ligne produite set "JVM_OPTS=..." et ajoutez la vôtre avant le test sur 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%"

Conservez le contenu existant de JVM_OPTS. Ne supprimez pas les options internes dont Spring Boot ou JavaFX a besoin.

Tomcat au premier plan sous Windows

Modifiez bin\catalina.bat et ajoutez votre ligne après le set "JVM_OPTS=..." existant :

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

Cela vaut pour run.bat et pour bin\catalina.bat run.

Tomcat en arrière-plan sous Windows

bin\startup.bat crée le processus d'arrière-plan via PowerShell. Le plus simple, pour un changement durable, est de définir APP_JAVA_OPTS avant l'appel à catalina.bat :

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

Si vous voulez couvrir premier plan et arrière-plan sans maintenir deux scripts, mieux vaut régénérer le paquet Tomcat avec --jvm-option depuis l'interface ou la ligne de commande.

6. Utiliser APP_JAVA_OPTS le temps d'une exécution

macOS et Linux

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

Pour Tomcat :

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

CMD sous Windows

Définissez-la pour la session CMD courante. Les commandes suivantes en héritent ; effacez-la avec set APP_JAVA_OPTS=.

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

Pour la cantonner et rétablir l'environnement ensuite :

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

Pour Tomcat :

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

PowerShell sous Windows

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

7. Ordre et mises en garde

  • Les options générées par l'outil viennent en premier, puis celles définies dans l'interface ou en ligne de commande, et APP_JAVA_OPTS est ajoutée en dernier.
  • Pour certaines options JVM, une valeur ultérieure remplace la précédente, mais toutes ne peuvent pas être répétées sans risque : ne comptez pas sur la répétition pour écraser une valeur.
  • APP_JAVA_OPTS est découpée sur les espaces et ne peut donc pas porter une option qui en contient. Passez alors par l'interface, par --jvm-option ou par la modification du tableau dans le script.
  • Les options JVM se placent avant la classe principale ou -jar ; les arguments de l'application viennent après la commande run.sh ou run.bat.
  • Après avoir modifié la taille du tas, vérifiez-la au regard de la limite mémoire de votre conteneur, de la mémoire disponible de l'hôte et de votre charge réelle.
  • Un nouvel empaquetage écrase les scripts de démarrage, et les modifications manuelles ne sont pas réintégrées automatiquement.