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