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 e javac
    • Hanno questa precedenza:
      1. _JAVA_OPTIONS (sovrascrive gli altri)
      2. Parametri della riga di comando
      3. JAVA_TOOL_OPTIONS (viene sovrascritto dagli altri)

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 a java e javac)
  • 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
Author: Community, 2015-02-04

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.

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

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.

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

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 .

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