Différence entre _JAVA_OPTIONS, JAVA_TOOL_OPTIONS et JAVA_OPTS

151

J'ai pensé que ce serait formidable d'avoir une comparaison entre _JAVA_OPTIONSet JAVA_TOOL_OPTIONS. J'en ai cherché un peu, mais je ne trouve rien, donc j'espère que nous pourrons trouver les connaissances ici sur Stackoverflow.

JAVA_OPTSest inclus par souci d'exhaustivité. Il ne fait pas partie de la JVM, mais il y a beaucoup de questions à ce sujet dans la nature.

Ce que je sais:

Jusqu'à présent, j'ai découvert que:

  • JAVA_OPTSn'est pas utilisé par le JDK, mais par un tas d'autres applications (voir cet article ).
  • JAVA_TOOL_OPTIONSet _JAVA_OPTIONSsont des moyens de spécifier des arguments JVM en tant que variable d'environnement au lieu de paramètres de ligne de commande.
    • Les sont ramassés par au moins javaetjavac
    • Ils ont cette priorité:
      1. _JAVA_OPTIONS (écrase les autres)
      2. Paramètres de ligne de commande
      3. JAVA_TOOL_OPTIONS (est écrasé par les autres)

Ce que j'aimerais savoir

  • Existe-t-il une documentation officielle comparant JAVA_TOOL_OPTIONSet_JAVA_OPTIONS
  • Existe-t-il d'autres différences entre JAVA_TOOL_OPTIONSet _JAVA_OPTIONS(sauf par ordre de priorité).
  • Quels exécutables ramassent JAVA_TOOL_OPTIONSet _JAVA_OPTIONS(en plus de javaet javac)
  • Toute limitation de ce qui peut être inclus sur JAVA_TOOL_OPTIONSet_JAVA_OPTIONS

Documentation officielle

Je n'ai pas pu trouver de documentation sur _JAVA_OPTIONS. La documentation pourJAVA_TOOL_OPTIONS ne fait pas beaucoup de lumière sur la différence:

Étant donné que la ligne de commande ne peut pas toujours être accédée ou modifiée, par exemple dans les VM intégrées ou simplement les VM lancées en profondeur dans les scripts, une variable JAVA_TOOL_OPTIONS est fournie afin que les agents puissent être lancés dans ces cas.
...

Exemple de script

C'est le code que j'ai utilisé pour comprendre cela. La sortie de la console est incluse en tant que commentaires:

export JAVA_OPTS=foobar
export JAVA_TOOL_OPTIONS= 
export _JAVA_OPTIONS="-Xmx512m -Xms64m"

java -version                          
# Picked up JAVA_TOOL_OPTIONS: 
# Picked up _JAVA_OPTIONS: -Xmx512m -Xms64m
# java version "1.7.0_40"
OpenJDK Runtime Environment (IcedTea 2.4.1) (suse-3.41.1-x86_64)
OpenJDK 64-Bit Server VM (build 24.0-b50, mixed mode)

javac -version
# Picked up JAVA_TOOL_OPTIONS: 
# Picked up _JAVA_OPTIONS: -Xmx512m -Xms64m
# javac 1.7.0_40

export JAVA_TOOL_OPTIONS="-Xmx1 -Xms1"
export _JAVA_OPTIONS="-Xmx512m -Xms64m"
javac -version
# Picked up JAVA_TOOL_OPTIONS: -Xmx1 -Xms1
# Picked up _JAVA_OPTIONS: -Xmx512m -Xms64m
# javac 1.7.0_40

export JAVA_TOOL_OPTIONS="-Xmx512m -Xms64m"
export _JAVA_OPTIONS="-Xmx1 -Xms1"
javac -version
# Picked up JAVA_TOOL_OPTIONS: -Xmx512m -Xms64m
# Picked up _JAVA_OPTIONS: -Xmx1 -Xms1
# Error occurred during initialization of VM
# Too small initial heap

export JAVA_TOOL_OPTIONS="-Xmx1 -Xms1"
export _JAVA_OPTIONS=
java -Xmx512m -Xms64m -version
# Picked up JAVA_TOOL_OPTIONS: -Xmx1 -Xms1
# Picked up _JAVA_OPTIONS: 
# java version "1.7.0_40"
# OpenJDK Runtime Environment (IcedTea 2.4.1) (suse-3.41.1-x86_64)
# OpenJDK 64-Bit Server VM (build 24.0-b50, mixed mode)

export JAVA_TOOL_OPTIONS=
export _JAVA_OPTIONS="-Xmx1 -Xms1"
java -Xmx512m -Xms64m -version
# Picked up JAVA_TOOL_OPTIONS: 
# Picked up _JAVA_OPTIONS: -Xmx1 -Xms1
# Error occurred during initialization of VM
# Too small initial heap
Tobber
la source
2
3
Et depuis JDK 9+ , il y a JDK_JAVA_OPTIONScomme remplacement préféré, voir stackoverflow.com/q/52986487/537554
ryenus

Réponses:

62

Vous l'avez à peu près cloué, sauf que ces options sont prises même si vous démarrez la JVM en cours via un appel de bibliothèque.

Le fait que cela _JAVA_OPTIONSne soit pas documenté suggère qu'il n'est pas recommandé d'utiliser cette variable, et j'ai en fait vu des gens en abuser en la définissant dans leur ~/.bashrc. Cependant, si vous voulez aller au fond de ce problème, vous pouvez vérifier la source d'Oracle HotSpot VM (par exemple dans OpenJDK7 ).

Vous devez également vous rappeler qu'il n'y a aucune garantie que d'autres machines virtuelles prennent ou continueront de prendre en charge les variables non documentées.

MISE À JOUR 04/08/2015: Pour gagner cinq minutes pour les personnes venant des moteurs de recherche, l' _JAVA_OPTIONSemporte sur les arguments de ligne de commande, qui à leur tour l'emportent JAVA_TOOL_OPTIONS.

mkalkov
la source
36

Il y a une autre différence: _JAVA_OPTIONSest spécifique à Oracle. IBM JVM utilise à la IBM_JAVA_OPTIONSplace. Cela a probablement été fait pour pouvoir définir des options spécifiques à la machine sans collisions. JAVA_TOOL_OPTIONSest reconnu par toutes les VM.

Victor Havin
la source
21

JAVA_OPTSn'ont aucun traitement spécial dans JVM.

Et selon https://bugs.openjdk.java.net/browse/JDK-4971166, le JAVA_TOOL_OPTIONSest inclus dans la spécification JVMTI standard, fait une meilleure gestion des espaces entre guillemets et devrait toujours être préféré au lieu de Hotspot non documenté spécifique _JAVA_OPTIONS.

Attention également à ce que l'utilisation de ces messages imprime sur stdout un message supplémentaire qui ne peut pas être supprimé .


Comme @ryenus l'a noté, depuis JDK 9+, il existe JDK_JAVA_OPTIONS comme remplacement préféré, voir Quelle est la différence entre JDK_JAVA_OPTIONS et JAVA_TOOL_OPTIONS lors de l'utilisation de Java 11?

Vadzim
la source