Ich dachte, es wäre großartig, einen Vergleich zwischen _JAVA_OPTIONS
und 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_OPTS
ist 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_OPTS
wird nicht vom JDK verwendet, sondern von einer Reihe anderer Apps (siehe diesen Beitrag ).JAVA_TOOL_OPTIONS
und_JAVA_OPTIONS
sind Möglichkeiten, JVM-Argumente als Umgebungsvariable anstelle von Befehlszeilenparametern anzugeben.- Die werden von mindestens
java
und abgeholtjavac
- Sie haben diesen Vorrang:
_JAVA_OPTIONS
(überschreibt die anderen)- Befehlszeilenparameter
JAVA_TOOL_OPTIONS
(wird von den anderen überschrieben)
- Die werden von mindestens
Was ich gerne wissen würde
- Gibt es offizielle Dokumentationen zum Vergleich
JAVA_TOOL_OPTIONS
und_JAVA_OPTIONS
- Gibt es andere Unterschiede zwischen
JAVA_TOOL_OPTIONS
und_JAVA_OPTIONS
(außer nach Vorrang) ? - Welche ausführbaren Dateien abholen
JAVA_TOOL_OPTIONS
und_JAVA_OPTIONS
(zusätzlich zujava
undjavac
) - Jede Einschränkung dessen, was auf
JAVA_TOOL_OPTIONS
und 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
quelle
JDK_JAVA_OPTIONS
als bevorzugten Ersatz, siehe stackoverflow.com/q/52986487/537554Antworten:
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_OPTIONS
die 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_OPTIONS
Befehlszeilenargumente übertrumpft, die wiederum übertrumpfenJAVA_TOOL_OPTIONS
.quelle
Es gibt noch einen Unterschied:
_JAVA_OPTIONS
Ist Oracle-spezifisch. IBM JVM verwendetIBM_JAVA_OPTIONS
stattdessen. Dies wurde wahrscheinlich gemacht, um maschinenspezifische Optionen ohne Kollisionen definieren zu können.JAVA_TOOL_OPTIONS
wird von allen VMs erkannt.quelle
JAVA_OPTS
habe überhaupt keine spezielle Behandlung in JVM.Und nach https://bugs.openjdk.java.net/browse/JDK-4971166 der
JAVA_TOOL_OPTIONS
in 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?
quelle