web-dev-qa-db-fra.com

Différence entre _Java_OPTIONS Java_TOOL_OPTIONS et Java_OPTS

Je pensais que ce serait bien d’avoir une comparaison entre __Java_OPTIONS_ et _Java_TOOL_OPTIONS_. J'en ai cherché un peu, mais je ne trouve rien, alors j'espère que nous pourrons trouver les connaissances ici sur Stackoverflow.

_Java_OPTS_ est inclus pour une complétude. Cela ne fait pas partie de la machine virtuelle, 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_OPTS n'est pas utilisé par le JDK, mais par de nombreuses autres applications (voir this post ).
  • Java_TOOL_OPTIONS et _Java_OPTIONS sont des moyens de: spécifiez les arguments de la machine virtuelle Java en tant que variable d'environnement au lieu de paramètres de ligne de commande.
    • Les sont repris par au moins Java et javac
    • 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_OPTIONS_ et __Java_OPTIONS_
  • Existe-t-il d'autres différences entre _Java_TOOL_OPTIONS_ et __Java_OPTIONS_ (à l'exception de la priorité).
  • Quels exécutables récupèrent _Java_TOOL_OPTIONS_ et __Java_OPTIONS_ (en plus de Java et javac)
  • Toute limitation de ce qui peut être inclus sur _Java_TOOL_OPTIONS_ et __Java_OPTIONS_

Documentation officielle

Je n'ai trouvé aucune documentation sur __Java_OPTIONS_. La documentation de _Java_TOOL_OPTIONS_ n'apporte 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 machines virtuelles incorporées ou simplement lancées au cœur de scripts, une variable Java_TOOL_OPTIONS est fournie afin que des 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 sous forme de 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
_
112
Tobber

Vous l'avez à peu près cloué, sauf que ces options sont sélectionnées même si vous démarrez JVM en cours via un appel à la 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 personnes en abuser en la configurant dans leur ~/.bashrc. Toutefois, si vous souhaitez aller au fond de ce problème, vous pouvez vérifier la source du serveur Oracle HotSpot VM (par exemple, dans OpenJDK7 ).

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

UPDATE 2015-08-04: Pour gagner cinq minutes pour les personnes issues des moteurs de recherche, _Java_OPTIONS remplace les arguments de ligne de commande, qui à leur tour remplacent Java_TOOL_OPTIONS.

49
mkalkov

Il y a encore une différence: _Java_OPTIONS est spécifique à Oracle. La machine virtuelle Java IBM utilise IBM_Java_OPTIONS à la place. Cela a probablement été fait pour pouvoir définir des options spécifiques à la machine sans collision. Java_TOOL_OPTIONS est reconnu par tous les ordinateurs virtuels.

27
Victor Havin

Java_OPTS have pas de traitement spécial 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, gère mieux les espaces cités et doit toujours être préféré au lieu de non documenté _Java_OPTIONS spécifique à Hotspot.

Attention également à l’utilisation de ces affiche un message supplémentaire qui ne peut pas être supprimé .

14
Vadzim