Differenza tra OPZIONI JAVA OPZIONI DELLO STRUMENTO JAVA e OPZIONI JAVA
Ho pensato che sarebbe stato bello avere un confronto tra _JAVA_OPTIONS
e JAVA_TOOL_OPTIONS
.
Ho cercato un po ' per uno, ma non riesco a trovare nulla, quindi spero che possiamo trovare la conoscenza qui su Stackoverflow.
JAVA_OPTS
è incluso per completezza. Non fa parte della JVM, ma c'è un sacco di domande su di esso in natura.
Quello che so:
Finora ho scoperto che:
-
JAVA_OPTS
non è usato dal JDK, ma da un gruppo di altri app (vedi questo post). -
JAVA_TOOL_OPTIONS
e_JAVA_OPTIONS
sono modi per specificare gli argomenti JVM come variabile di ambiente anziché i parametri della riga di comando.- Sono prelevati da almeno
java
ejavac
- Hanno questa precedenza:
-
_JAVA_OPTIONS
(sovrascrive gli altri) - Parametri della riga di comando
-
JAVA_TOOL_OPTIONS
(viene sovrascritto dagli altri)
-
- Sono prelevati da almeno
Quello che vorrei conoscere
- Esistono documenti ufficiali che confrontano
JAVA_TOOL_OPTIONS
e_JAVA_OPTIONS
- Ci sono altre differenze tra
JAVA_TOOL_OPTIONS
e_JAVA_OPTIONS
(eccetto dalla precedenza). - Quali eseguibili raccolgono
JAVA_TOOL_OPTIONS
e_JAVA_OPTIONS
(oltre ajava
ejavac
) - Qualsiasi limitazione su ciò che può essere incluso su
JAVA_TOOL_OPTIONS
e_JAVA_OPTIONS
Documentazione ufficiale
Non sono stato in grado di trovare alcuna documentazione su _JAVA_OPTIONS
. La documentazione per JAVA_TOOL_OPTIONS
non fa molta luce sulla differenza:
Poiché non è sempre possibile accedere o modificare la riga di comando, ad esempio nelle VM incorporate o semplicemente nelle VM avviate in profondità all'interno degli script, viene fornita una variabile JAVA_TOOL_OPTIONS in modo che gli agenti possano essere avviati in questi casi.
...
Script di esempio
Questo è il codice che ho usato per capirlo. L'output della console è incluso come commenti:
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 answers
L'hai praticamente inchiodato, tranne che queste opzioni vengono raccolte anche se avvii JVM in-process tramite una chiamata alla libreria.
Il fatto che _JAVA_OPTIONS
non sia documentato suggerisce che non è consigliabile utilizzare questa variabile, e in realtà ho visto persone abusarne impostandola nel loro ~/.bashrc
. Tuttavia, se si desidera andare a fondo di questo problema, è possibile controllare l'origine di Oracle HotSpot VM (ad esempio in OpenJDK7).
Dovresti anche ricordare che non c'è garantire che altre macchine virtuali abbiano o continueranno ad avere supporto per variabili non documentate.
AGGIORNAMENTO 2015-08-04: Per risparmiare cinque minuti per la gente proveniente dai motori di ricerca, _JAVA_OPTIONS
trionfi argomenti della riga di comando, che a sua volta trump JAVA_TOOL_OPTIONS
.
C'è un'altra differenza: _JAVA_OPTIONS
è specifico di Oracle. IBM JVM utilizza invece IBM_JAVA_OPTIONS
. Questo è stato probabilmente fatto per essere in grado di definire opzioni specifiche della macchina senza collisioni. JAVA_TOOL_OPTIONS
è riconosciuto da tutte le macchine virtuali.
JAVA_OPTS
avere nessuna gestione speciale in JVM.
E secondo https://bugs.openjdk.java.net/browse/JDK-4971166 il JAVA_TOOL_OPTIONS
è incluso nelle specifiche JVMTI standard, gestisce meglio gli spazi tra virgolette e dovrebbe essere sempre preferito a _JAVA_OPTIONS
specifico dell'Hotspot non documentato.
Fai attenzione anche che usando questi stampa un messaggio aggiuntivo su stdout che non può essere soppresso .