Diferencia entre _JAVA_OPTIONS, JAVA_TOOL_OPTIONS y JAVA_OPTS

151

Pensé que sería genial tener una comparación entre _JAVA_OPTIONSy JAVA_TOOL_OPTIONS. He estado buscando un poco, pero no puedo encontrar nada, así que espero que podamos encontrar el conocimiento aquí en Stackoverflow.

JAVA_OPTSSe incluye para completar. No es parte de la JVM, pero hay muchas preguntas al respecto en la naturaleza.

Lo que yo sé:

Hasta ahora he descubierto que:

  • JAVA_OPTSJDK no lo usa, pero sí muchas otras aplicaciones (vea esta publicación ).
  • JAVA_TOOL_OPTIONSy _JAVA_OPTIONSson formas de especificar argumentos JVM como una variable de entorno en lugar de parámetros de línea de comandos.
    • Son recogidos por al menos javayjavac
    • Tienen esta precedencia:
      1. _JAVA_OPTIONS (sobrescribe a los demás)
      2. Parámetros de línea de comando
      3. JAVA_TOOL_OPTIONS (es sobrescrito por los demás)

Lo que me gustaria saber

  • ¿Existe alguna documentación oficial que compare JAVA_TOOL_OPTIONSy_JAVA_OPTIONS
  • ¿Hay alguna otra diferencia entre JAVA_TOOL_OPTIONSy _JAVA_OPTIONS(excepto por precedencia)?
  • Qué ejecutables recogen JAVA_TOOL_OPTIONSy _JAVA_OPTIONS(además de javay javac)
  • Cualquier limitación sobre lo que se puede incluir JAVA_TOOL_OPTIONSy_JAVA_OPTIONS

Documentación oficial

No he podido encontrar ninguna documentación sobre _JAVA_OPTIONS. La documentación paraJAVA_TOOL_OPTIONS no arroja mucha luz sobre la diferencia:

Dado que no siempre se puede acceder o modificar la línea de comandos, por ejemplo, en máquinas virtuales integradas o simplemente máquinas virtuales lanzadas dentro de scripts, se proporciona una variable JAVA_TOOL_OPTIONS para que los agentes se puedan iniciar en estos casos.
...

Script de ejemplo

Este es el código que usé para resolver esto. La salida de la consola se incluye como comentarios:

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
Tobber
fuente
3
Y desde JDK 9+ , existe JDK_JAVA_OPTIONSel reemplazo preferido, consulte stackoverflow.com/q/52986487/537554
ryenus el

Respuestas:

62

Lo ha clavado prácticamente, excepto que estas opciones se recogen incluso si inicia JVM en proceso a través de una llamada a la biblioteca.

El hecho de que _JAVA_OPTIONSno esté documentado sugiere que no se recomienda usar esta variable, y realmente he visto a personas abusar de ella al configurarla en su ~/.bashrc. Sin embargo, si desea llegar al fondo de este problema, puede verificar la fuente de Oracle HotSpot VM (por ejemplo, en OpenJDK7 ).

También debe recordar que no hay garantía de que otras máquinas virtuales tengan o continuarán teniendo soporte para variables no documentadas.

ACTUALIZACIÓN 2015-08-04: Para ahorrar cinco minutos para las personas que provienen de los motores de búsqueda, _JAVA_OPTIONSprevalecen los argumentos de la línea de comandos, que a su vez triunfan JAVA_TOOL_OPTIONS.

mkalkov
fuente
36

Hay una diferencia más: _JAVA_OPTIONSes específica de Oracle. IBM JVM está utilizando en su IBM_JAVA_OPTIONSlugar. Esto probablemente se hizo para poder definir opciones específicas de la máquina sin colisiones. JAVA_TOOL_OPTIONSes reconocido por todas las máquinas virtuales.

Victor Havin
fuente
21

JAVA_OPTSno tiene manejo especial en JVM en absoluto.

Y de acuerdo con https://bugs.openjdk.java.net/browse/JDK-4971166 la JAVA_TOOL_OPTIONSestá incluido en la especificación estándar JVMTI, hace mejor manejo de los espacios citados y debe ser siempre preferido en lugar de indocumentado Hotspot-específica _JAVA_OPTIONS.

También tenga en cuenta que el uso de estas impresiones envía mensajes adicionales a stdout que no se pueden suprimir .


Como señaló @ryenus, desde JDK 9+, hay JDK_JAVA_OPTIONS como el reemplazo preferido, vea ¿Cuál es la diferencia entre JDK_JAVA_OPTIONS y JAVA_TOOL_OPTIONS cuando se usa Java 11?

Vadzim
fuente