Differenza tra _JAVA_OPTIONS, JAVA_TOOL_OPTIONS e JAVA_OPTS


151

Ho pensato che sarebbe bello avere un confronto tra _JAVA_OPTIONSe JAVA_TOOL_OPTIONS. Ne ho cercato un po ', ma non riesco a trovare nulla, quindi spero di poter trovare le conoscenze qui su StackOverflow.

JAVA_OPTSè incluso per completezza. Non fa parte della JVM, ma ci sono molte domande al riguardo in natura.

Quello che so:

Finora ho scoperto che:

  • JAVA_OPTSnon è utilizzato da JDK, ma da un sacco di altre app (vedi questo post ).
  • JAVA_TOOL_OPTIONSe _JAVA_OPTIONSsono modi per specificare gli argomenti JVM come variabile di ambiente anziché come parametri della riga di comando.
    • Sono raccolti da almeno javaejavac
    • Hanno questa precedenza:
      1. _JAVA_OPTIONS (sovrascrive gli altri)
      2. Parametri della riga di comando
      3. JAVA_TOOL_OPTIONS (viene sovrascritto dagli altri)

Cosa vorrei sapere

  • Esistono documenti ufficiali a confronto JAVA_TOOL_OPTIONSe_JAVA_OPTIONS
  • Ci sono altre differenze tra JAVA_TOOL_OPTIONSe _JAVA_OPTIONS(tranne che dalla precedenza).
  • Quali file eseguibili raccolgono JAVA_TOOL_OPTIONSe _JAVA_OPTIONS(oltre a javae javac)
  • Qualsiasi limitazione su ciò che può essere incluso su JAVA_TOOL_OPTIONSe_JAVA_OPTIONS

Documentazione ufficiale

Non sono stato in grado di trovare alcuna documentazione su _JAVA_OPTIONS. La documentazione perJAVA_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 lanciate in profondità negli 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
E poiché JDK 9+ , c'è JDK_JAVA_OPTIONScome la sostituzione preferito, vedere stackoverflow.com/q/52986487/537554
ryenus

Risposte:


62

Hai praticamente risolto il problema, tranne per il fatto che queste opzioni vengono raccolte anche se avvii JVM in-process tramite una chiamata in libreria.

Il fatto che _JAVA_OPTIONSnon sia documentato suggerisce che non è consigliabile utilizzare questa variabile e in realtà ho visto le persone abusarne impostandola nella loro ~/.bashrc. Tuttavia, se si desidera arrivare alla fine di questo problema, è possibile controllare l'origine di Oracle HotSpot VM (ad esempio in OpenJDK7 ).

È inoltre necessario ricordare che non esiste alcuna garanzia che le altre macchine virtuali abbiano o continueranno ad avere supporto per variabili non documentate.

AGGIORNAMENTO 2015-08-04: Per risparmiare cinque minuti per le persone provenienti dai motori di ricerca, _JAVA_OPTIONSsupera gli argomenti della riga di comando, che a loro volta vincono JAVA_TOOL_OPTIONS.


36

C'è un'altra differenza: _JAVA_OPTIONSè specifico di Oracle. IBM JVM sta utilizzando IBM_JAVA_OPTIONSinvece. Ciò è stato probabilmente fatto per essere in grado di definire opzioni specifiche della macchina senza collisioni. JAVA_TOOL_OPTIONSè riconosciuto da tutte le macchine virtuali.


21

JAVA_OPTSnon ha alcuna gestione speciale in JVM.

E secondo https://bugs.openjdk.java.net/browse/JDK-4971166 questo JAVA_TOOL_OPTIONSè incluso nelle specifiche standard JVMTI, fa una migliore gestione degli spazi quotati e dovrebbe essere sempre preferito anziché specifico di Hotspot non documentato _JAVA_OPTIONS.

Attenzione anche che l'utilizzo di questi stampa messaggi aggiuntivi su stdout che non possono essere soppressi .


Come notato da @ryenus, da JDK 9+, c'è JDK_JAVA_OPTIONS come sostituto preferito, vedi Qual è la differenza tra JDK_JAVA_OPTIONS e JAVA_TOOL_OPTIONS quando si utilizza Java 11?

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.