Разница между _JAVA_OPTIONS, JAVA_TOOL_OPTIONS и JAVA_OPTS

151

Я думал, что было бы здорово иметь сравнение между _JAVA_OPTIONSи JAVA_TOOL_OPTIONS. Я немного искал один, но ничего не могу найти, поэтому надеюсь, что мы сможем найти здесь знания о Stackoverflow.

JAVA_OPTSвключен для полноты Это не часть JVM, но есть много вопросов об этом в дикой природе.

Что я знаю:

До сих пор я узнал, что:

  • JAVA_OPTSиспользуется не JDK, а кучей других приложений (см. этот пост ).
  • JAVA_TOOL_OPTIONSи _JAVA_OPTIONSесть способы указать аргументы JVM в качестве переменной среды вместо параметров командной строки.
    • Подобраны по крайней мере javaиjavac
    • У них есть этот приоритет:
      1. _JAVA_OPTIONS (перезаписывает остальные)
      2. Параметры командной строки
      3. 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
Tobber
источник
2
связанные с : stackoverflow.com/questions/17781405/...
3
А так как JDK 9+ , есть в JDK_JAVA_OPTIONSкачестве предпочтительного замены см stackoverflow.com/q/52986487/537554
ryenus

Ответы:

62

Вы в значительной степени прибили его, за исключением того, что эти опции подобраны, даже если вы запускаете JVM в процессе через вызов библиотеки.

Тот факт, что _JAVA_OPTIONSне задокументировано, говорит о том, что не рекомендуется использовать эту переменную, и я действительно видел, как люди злоупотребляли ею, устанавливая ее в своих ~/.bashrc. Однако, если вы хотите докопаться до сути этой проблемы, вы можете проверить источник виртуальной машины Oracle HotSpot (например, в OpenJDK7 ).

Вы также должны помнить, что нет никакой гарантии, что другие виртуальные машины имеют или будут продолжать поддерживать недокументированные переменные.

ОБНОВЛЕНИЕ 2015-08-04: Чтобы сэкономить пять минут для людей, прибывающих из поисковых систем, _JAVA_OPTIONSберут аргументы командной строки, которые в свою очередь бьют JAVA_TOOL_OPTIONS.

mkalkov
источник
36

Есть еще одно отличие: _JAVA_OPTIONSэто специфично для Oracle. IBM JVM использует IBM_JAVA_OPTIONSвместо этого. Вероятно, это было сделано для того, чтобы можно было определять параметры машины без коллизий. JAVA_TOOL_OPTIONSраспознается всеми виртуальными машинами.

Виктор Хавин
источник
21

JAVA_OPTSне имеют специальной обработки в JVM вообще.

И в соответствии с https://bugs.openjdk.java.net/browse/JDK-4971166JAVA_TOOL_OPTIONS входят в стандартной спецификации JVMTI, делает лучше обработки котировочных пространств и должно быть всегда предпочтительнее вместо незарегистрированной Hotspot-специфической _JAVA_OPTIONS.

Также имейте в виду, что при их использовании в стандартный вывод выводится дополнительное сообщение, которое невозможно подавить .


Как заметил @ryenus, начиная с JDK 9+, JDK_JAVA_OPTIONS является предпочтительной заменой, см. В чем разница между JDK_JAVA_OPTIONS и JAVA_TOOL_OPTIONS при использовании Java 11?

Vadzim
источник