Différence entre les OPTIONS JAVA TOOL OPTIONS et les options JAVA
j'ai pensé qu'il serait bon d'avoir une comparaison entre _JAVA_OPTIONS
et JAVA_TOOL_OPTIONS
.
J'ai cherché un peu, mais je ne trouve rien, donc j'espère que nous pouvons trouver la connaissance ici sur Stackoverflow.
JAVA_OPTS
est inclus pour l'intégralité. Il ne fait pas partie de la JVM, mais il ya beaucoup de questions à ce sujet dans la nature.
Ce que je sais:
jusqu'à présent, j'ai découvert que:
-
JAVA_OPTS
n'est pas utilisé par le JDK, mais par un tas d'autres applications (voir ce post ). -
JAVA_TOOL_OPTIONS
et_JAVA_OPTIONS
sont des façons de spécifier les arguments JVM comme une variable d'environnement au lieu de paramètres de ligne de commande.- sont repris par au moins
java
etjavac
- Ils ont cette priorité:
-
_JAVA_OPTIONS
(écrase les autres) - paramètres de ligne de commande
-
JAVA_TOOL_OPTIONS
(est remplacé par les autres)
-
- sont repris par au moins
ce que j'aimerais savoir
- Existe-t-il une documentation officielle comparant
JAVA_TOOL_OPTIONS
et_JAVA_OPTIONS
- y a-t-il d'autres différences entre
JAVA_TOOL_OPTIONS
et_JAVA_OPTIONS
(sauf de priorité)? - dont les exécutables récupèrent
JAVA_TOOL_OPTIONS
et_JAVA_OPTIONS
(en plus dejava
etjavac
) - toute limitation de ce qui peut être inclus sur
JAVA_TOOL_OPTIONS
et_JAVA_OPTIONS
1519370920"
Documentation Officielle
Je n'ai pas pu trouver documentation sur _JAVA_OPTIONS
. la documentation pour JAVA_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 consultée ou modifiée, par exemple dans les VMs intégrés ou simplement dans les VMs lancés en profondeur dans les scripts, une variable JAVA_TOOL_OPTIONS est fournie afin que les agents puissent être lancés dans ces cas.
...
exemple script
C'est le code que j'ai utilisé pour cela. La sortie de la Console est incluse comme commentaire:
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
3 réponses
vous avez assez cloué sauf que ces options sont ramassées même si vous commencez JVM en cours via un appel de bibliothèque.
le fait que _JAVA_OPTIONS
ne soit pas documenté suggère qu'il n'est pas recommandé d'utiliser cette variable, et j'ai en fait vu des gens l'abuser en mettant dans leur ~/.bashrc
. Cependant, si vous voulez aller au fond de ce problème, vous pouvez vérifier la source de Oracle HotSpot VM (par exemple dans OpenJDK7 ).
vous devez également vous rappeler qu'il n'y a aucune garantie que d'autres VMs ont ou continueront d'avoir un support pour les variables non documentées.
mise à jour 2015-08-04: pour sauver cinq minutes pour les gens venant des moteurs de recherche, _JAVA_OPTIONS
l'emporte sur les arguments en ligne de commande, qui à son tour trump JAVA_TOOL_OPTIONS
.
il y a une autre différence: _JAVA_OPTIONS
est spécifique à Oracle. IBM JVM utilise IBM_JAVA_OPTIONS
à la place. Cela a probablement été fait pour pouvoir définir des options spécifiques à la machine sans collisions. JAVA_TOOL_OPTIONS
est reconnu par tous les VMs.
JAVA_OPTS
ont pas de traitement particulier dans la JVM.
et selon https://bugs.openjdk.java.net/browse/JDK-4971166 le JAVA_TOOL_OPTIONS
est inclus dans la spécification JVMTI standard, permet une meilleure manipulation des espaces cités et devrait toujours être préféré au _JAVA_OPTIONS
spécifique à un Hotspot non documenté .
attention également que l'utilisation de ces imprimer un message supplémentaire à stdout cela ne peut pas être supprimé .