Разница между _JAVA_OPTIONS JAVA_TOOL_OPTIONS и JAVA_OPTS
Я подумал, что было бы здорово провести сравнение между _JAVA_OPTIONS
и JAVA_TOOL_OPTIONS
.
Я искал немного для одного, но я ничего не могу найти, поэтому надеюсь, что мы найдем здесь знания на Stackoverflow.
JAVA_OPTS
включен для полноты. Это не часть JVM, но в нем много вопросов.
Что я знаю:
До сих пор я узнал, что:
-
JAVA_OPTS
не используется JDK, а рядом других приложений (см. этот пост).
-
JAVA_TOOL_OPTIONS
и _JAVA_OPTIONS
- это способы указания аргументов JVM в качестве переменной окружения вместо параметров командной строки.
- Поднимаются как минимум
java
и javac
- У них есть это преимущество:
-
_JAVA_OPTIONS
(перезаписывает остальные)
- Параметры командной строки
-
JAVA_TOOL_OPTIONS
(перезаписывается другими)
Что я хотел бы знать
- Есть ли официальная документация, сравнивающая
JAVA_TOOL_OPTIONS
и _JAVA_OPTIONS
- Существуют ли другие различия между
JAVA_TOOL_OPTIONS
и _JAVA_OPTIONS
(кроме приоритета).
- Какие исполняемые файлы выбирают
JAVA_TOOL_OPTIONS
и _JAVA_OPTIONS
(в дополнение к java
и javac
)
- Любое ограничение на то, что может быть включено в
JAVA_TOOL_OPTIONS
и _JAVA_OPTIONS
Официальная документация
Мне не удалось найти документацию о _JAVA_OPTIONS
. Документация для JAVA_TOOL_OPTIONS
не проливает много света на разницу:
Поскольку в командной строке не всегда можно получить доступ или изменить, например, во встроенных виртуальных машинах или просто виртуальных машинах, запущенных глубоко внутри сценариев, предоставляется переменная JAVA_TOOL_OPTIONS, позволяющая запускать агентов в этих случаях.
...
Пример script
Это код, который я использовал, чтобы понять это. Консольный вывод включается в качестве комментариев:
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
Ответы
Ответ 1
Вы довольно много прибивали его, за исключением того, что эти параметры подбираются, даже если вы запускаете JVM в процессе через вызов библиотеки.
Тот факт, что _JAVA_OPTIONS
не документирован, указывает на то, что не рекомендуется использовать эту переменную, и я действительно видел, как люди злоупотребляют ею, установив ее в свой ~/.bashrc
. Однако, если вы хотите разобраться в этой проблеме, вы можете проверить источник Oracle HotSpot VM (например, в OpenJDK7).
Вы также должны помнить, что нет гарантии, что другие виртуальные машины имеют или будут продолжать поддерживать недокументированные переменные.
UPDATE 2015-08-04: Чтобы сохранить пять минут для людей, поступающих из поисковых систем, _JAVA_OPTIONS
транслирует аргументы командной строки, которые, в свою очередь, trump JAVA_TOOL_OPTIONS
.
Ответ 2
Есть еще одно отличие: _JAVA_OPTIONS
- это специфический для Oracle. Вместо этого IBM JVM использует IBM_JAVA_OPTIONS
. Вероятно, это было сделано, чтобы определить конкретные параметры машины без коллизий. JAVA_TOOL_OPTIONS
распознается всеми виртуальными машинами.
Ответ 3
JAVA_OPTS
не имеет специальной обработки в JVM вообще.
И в соответствии с https://bugs.openjdk.java.net/browse/JDK-4971166 JAVA_TOOL_OPTIONS
включен в стандартную спецификацию JVMTI, обеспечивает лучшую обработку пробельных кавычек и должен всегда предпочтительнее, чем недокументированные _JAVA_OPTIONS
Hotspot.
Также имейте в виду, что при их использовании в стандартный вывод выводится дополнительное сообщение, которое невозможно подавить.