Différence entre les OPTIONS JAVA LES OPTIONS DE L'OUTIL JAVA et les OPTIONS JAVA


Je pensais que ce serait génial d'avoir une comparaison entre _JAVA_OPTIONS et JAVA_TOOL_OPTIONS. J'en ai cherché un peu, mais je ne trouve rien, j'espère donc que nous pourrons trouver les connaissances 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 les applications (voir ce post).
  • JAVA_TOOL_OPTIONS et _JAVA_OPTIONS sont des moyens de spécifier des arguments JVM en tant que variable d'environnement au lieu de paramètres de ligne de commande.
    • Le sont captées par au moins java et javac
    • Ils ont cette priorité:
      1. _JAVA_OPTIONS (remplace les autres)
      2. paramètres de ligne de Commande
      3. JAVA_TOOL_OPTIONS (est écrasé par les autres)

Ce que je voudrais 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 la préséance).
  • , Qui exécutables ramasser JAVA_TOOL_OPTIONS et _JAVA_OPTIONS (en plus de java et javac)
  • Toute limitation sur ce qui peut être inclus sur JAVA_TOOL_OPTIONS et _JAVA_OPTIONS

Documentation officielle

Je n'ai pas pu trouver de 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 machines virtuelles intégrées ou simplement 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 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
Author: Community, 2015-02-04

3 answers

Vous l'avez à peu près cloué, sauf que ces options sont récupérées même si vous démarrez la JVM en cours de processus 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 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 de la machine virtuelle Oracle HotSpot (par exemple dans OpenJDK7).

Vous devez également vous rappeler qu'il n'y a pas garantir que d'autres machines virtuelles ont ou continueront d'avoir un support pour les variables non documentées.

MISE À JOUR 2015-08-04: Pour économiser cinq minutes pour les personnes provenant des moteurs de recherche, _JAVA_OPTIONS l'emporte sur les arguments de ligne de commande, qui à leur tour l'emportent sur JAVA_TOOL_OPTIONS.

 32
Author: mkalkov, 2015-08-14 12:30:40

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 toutes les machines virtuelles.

 18
Author: Victor Havin, 2015-11-05 23:55:30

JAVA_OPTS n'ont aucune manipulation spéciale dans JVM du tout.

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 gestion des espaces entre guillemets et devrait toujours être préféré au _JAVA_OPTIONS spécifique au Hotspot non documenté.

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

 8
Author: Vadzim, 2018-03-13 10:22:10