Pensé que sería genial tener una comparación entre _JAVA_OPTIONS
y 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_OPTS
Se 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_OPTS
JDK no lo usa, pero sí muchas otras aplicaciones (vea esta publicación ).JAVA_TOOL_OPTIONS
y_JAVA_OPTIONS
son 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
java
yjavac
- Tienen esta precedencia:
_JAVA_OPTIONS
(sobrescribe a los demás)- Parámetros de línea de comando
JAVA_TOOL_OPTIONS
(es sobrescrito por los demás)
- Son recogidos por al menos
Lo que me gustaria saber
- ¿Existe alguna documentación oficial que compare
JAVA_TOOL_OPTIONS
y_JAVA_OPTIONS
- ¿Hay alguna otra diferencia entre
JAVA_TOOL_OPTIONS
y_JAVA_OPTIONS
(excepto por precedencia)? - Qué ejecutables recogen
JAVA_TOOL_OPTIONS
y_JAVA_OPTIONS
(además dejava
yjavac
) - Cualquier limitación sobre lo que se puede incluir
JAVA_TOOL_OPTIONS
y_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
fuente
JDK_JAVA_OPTIONS
el reemplazo preferido, consulte stackoverflow.com/q/52986487/537554Respuestas:
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_OPTIONS
no 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_OPTIONS
prevalecen los argumentos de la línea de comandos, que a su vez triunfanJAVA_TOOL_OPTIONS
.fuente
Hay una diferencia más:
_JAVA_OPTIONS
es específica de Oracle. IBM JVM está utilizando en suIBM_JAVA_OPTIONS
lugar. Esto probablemente se hizo para poder definir opciones específicas de la máquina sin colisiones.JAVA_TOOL_OPTIONS
es reconocido por todas las máquinas virtuales.fuente
JAVA_OPTS
no tiene manejo especial en JVM en absoluto.Y de acuerdo con https://bugs.openjdk.java.net/browse/JDK-4971166 la
JAVA_TOOL_OPTIONS
está 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?
fuente