Unterschied zwischen _JAVA_OPTIONS, JAVA_TOOL_OPTIONS und JAVA_OPTS


151

Ich dachte, es wäre großartig, einen Vergleich zwischen _JAVA_OPTIONSund zu haben JAVA_TOOL_OPTIONS. Ich habe ein bisschen nach einem gesucht, aber ich kann nichts finden, also hoffe ich, dass wir das Wissen hier auf Stackoverflow finden können.

JAVA_OPTSist der Vollständigkeit halber enthalten. Es ist nicht Teil der JVM, aber es gibt viele Fragen dazu in freier Wildbahn.

Was ich weiß:

Bisher habe ich Folgendes herausgefunden:

  • JAVA_OPTSwird nicht vom JDK verwendet, sondern von einer Reihe anderer Apps (siehe diesen Beitrag ).
  • JAVA_TOOL_OPTIONSund _JAVA_OPTIONSsind Möglichkeiten, JVM-Argumente als Umgebungsvariable anstelle von Befehlszeilenparametern anzugeben.
    • Die werden von mindestens javaund abgeholtjavac
    • Sie haben diesen Vorrang:
      1. _JAVA_OPTIONS (überschreibt die anderen)
      2. Befehlszeilenparameter
      3. JAVA_TOOL_OPTIONS (wird von den anderen überschrieben)

Was ich gerne wissen würde

  • Gibt es offizielle Dokumentationen zum Vergleich JAVA_TOOL_OPTIONSund_JAVA_OPTIONS
  • Gibt es andere Unterschiede zwischen JAVA_TOOL_OPTIONSund _JAVA_OPTIONS(außer nach Vorrang) ?
  • Welche ausführbaren Dateien abholen JAVA_TOOL_OPTIONSund _JAVA_OPTIONS(zusätzlich zu javaund javac)
  • Jede Einschränkung dessen, was auf JAVA_TOOL_OPTIONSund enthalten sein kann_JAVA_OPTIONS

Offizielle Dokumentation

Ich konnte keine Dokumentation finden _JAVA_OPTIONS. Die Dokumentation fürJAVA_TOOL_OPTIONS wirft nicht viel Licht auf den Unterschied:

Da nicht immer auf die Befehlszeile zugegriffen oder diese geändert werden kann, z. B. in eingebetteten VMs oder einfach in VMs, die tief in Skripten gestartet wurden, wird eine Variable JAVA_TOOL_OPTIONS bereitgestellt, damit in diesen Fällen Agenten gestartet werden können.
...

Beispielskript

Dies ist der Code, mit dem ich das herausgefunden habe. Die Konsolenausgabe ist als Kommentar enthalten:

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
Und seit JDK 9+ gibt es JDK_JAVA_OPTIONSals bevorzugten Ersatz, siehe stackoverflow.com/q/52986487/537554
ryenus

Antworten:


62

Sie haben es ziemlich genau verstanden, außer dass diese Optionen auch dann aktiviert werden, wenn Sie JVM in Bearbeitung über einen Bibliotheksaufruf starten.

Die Tatsache, _JAVA_OPTIONSdie nicht dokumentiert ist, deutet darauf hin, dass es nicht empfohlen wird, diese Variable zu verwenden, und ich habe tatsächlich gesehen, dass Leute sie missbrauchen, indem sie sie in ihre Variable setzen ~/.bashrc. Wenn Sie diesem Problem jedoch auf den Grund gehen möchten, können Sie die Quelle der Oracle HotSpot-VM überprüfen (z . B. in OpenJDK7 ).

Sie sollten sich auch daran erinnern, dass es keine Garantie gibt, dass andere VMs undokumentierte Variablen unterstützen oder weiterhin unterstützen werden.

UPDATE 04.08.2015: Um fünf Minuten für Leute zu sparen, die von Suchmaschinen kommen, werden _JAVA_OPTIONSBefehlszeilenargumente übertrumpft, die wiederum übertrumpfen JAVA_TOOL_OPTIONS.


36

Es gibt noch einen Unterschied: _JAVA_OPTIONSIst Oracle-spezifisch. IBM JVM verwendet IBM_JAVA_OPTIONSstattdessen. Dies wurde wahrscheinlich gemacht, um maschinenspezifische Optionen ohne Kollisionen definieren zu können. JAVA_TOOL_OPTIONSwird von allen VMs erkannt.


21

JAVA_OPTShabe überhaupt keine spezielle Behandlung in JVM.

Und nach https://bugs.openjdk.java.net/browse/JDK-4971166 der JAVA_TOOL_OPTIONSin Standard JVMTI Spezifikation enthält, besser quotierter Räume ist die Handhabung und sollte immer anstelle von undokumentierten Hotspot spezifischen bevorzugt werden _JAVA_OPTIONS.

Beachten Sie auch, dass bei Verwendung dieser Zeichen zusätzliche Nachrichten an stdout gedruckt werden, die nicht unterdrückt werden können .


Wie @ryenus feststellte, gibt es seit JDK 9+ JDK_JAVA_OPTIONS als bevorzugten Ersatz. Siehe Was ist der Unterschied zwischen JDK_JAVA_OPTIONS und JAVA_TOOL_OPTIONS bei Verwendung von Java 11?

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.