Різниця між _JAVA_OPTIONS, JAVA_TOOL_OPTIONS та JAVA_OPTS


151

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

JAVA_OPTSвключено для повноти. Це не є частиною СВМ, але є багато питань щодо цього в дикій природі.

Що я знаю:

Поки що я з'ясував, що:

  • 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 не проливає багато світла на різницю:

Оскільки до командного рядка не завжди можна отримати доступ чи змінити його, наприклад, у вбудовані VM або просто VM, запущені глибоко в скриптах, надається змінна 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
А так як JDK 9+ , є в JDK_JAVA_OPTIONSякості кращого заміни см stackoverflow.com/q/52986487/537554
ryenus

Відповіді:


62

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

Факт, який _JAVA_OPTIONSне зафіксований документально, говорить про те, що використовувати цю змінну не рекомендується, і я фактично бачив, як люди її зловживають, встановлюючи її у своїй ~/.bashrc. Однак якщо ви хочете дійти до цієї проблеми, ви можете перевірити джерело Oracle HotSpot VM (наприклад, у OpenJDK7 ).

Також слід пам’ятати, що немає жодної гарантії, яку інші VM мають або надалі підтримуватимуть недокументовані змінні.

ОНОВЛЕННЯ 2015-08-04: Щоб заощадити п'ять хвилин для людей, що надходять із пошукових систем, _JAVA_OPTIONSкозирують аргументи командного рядка, які в свою чергу козирять JAVA_TOOL_OPTIONS.


36

Є ще одна відмінність: _JAVA_OPTIONSспецифічно для Oracle. IBM_JAVA_OPTIONSНатомість IBM JVM використовує . Це, мабуть, було зроблено для того, щоб можна було визначати конкретні варіанти машини без зіткнень. JAVA_TOOL_OPTIONSрозпізнається всіма машинами управління.


21

JAVA_OPTSвзагалі не мають спеціальної обробки в JVM.

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

Також майте на увазі, що використання цих відбитків додаткове повідомлення для stdout, яке неможливо придушити .


Як зазначав @ryenus, оскільки JDK 9+ є JDK_JAVA_OPTIONS як краща заміна, див. Яка різниця між JDK_JAVA_OPTIONS та JAVA_TOOL_OPTIONS при використанні Java 11?

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.