Różnica między opcjami JAVA opcje Narzędzia JAVA i opcje JAVA

Pomyślałem, że byłoby wspaniale mieć porównanie między _JAVA_OPTIONS i JAVA_TOOL_OPTIONS. Trochę Szukałem jednego, ale nie mogę znaleźć niczego, więc mam nadzieję, że znajdziemy wiedzę tutaj na temat Stackoverflow.

JAVA_OPTS jest uwzględniona dla kompletności. Nie jest to część JVM, ale jest wiele pytań na ten temat na wolności.

Co wiem:

Do tej pory dowiedziałem się, że:

  • JAVA_OPTS nie jest używany przez JDK, ale przez kilka innych aplikacje (zobacz ten post ).
  • JAVA_TOOL_OPTIONS oraz _JAVA_OPTIONS są sposobami określania argumentów JVM jako zmiennej środowiskowej zamiast parametrów wiersza poleceń.
    • są odbierane przez co najmniej java i javac
    • mają ten pierwszeństwo:
      1. _JAVA_OPTIONS (zastępuje Pozostałe)
      2. parametry wiersza poleceń
      3. JAVA_TOOL_OPTIONS (jest nadpisany przez innych)

Co chciałbym know

  • czy jest jakaś oficjalna dokumentacja porównująca JAVA_TOOL_OPTIONS i _JAVA_OPTIONS
  • czy są jakieś inne różnice między JAVA_TOOL_OPTIONS i _JAVA_OPTIONS (z wyjątkiem pierwszeństwa).
  • które Pliki Wykonywalne pobierają JAVA_TOOL_OPTIONS i _JAVA_OPTIONS (oprócz java i javac)
  • wszelkie ograniczenia co może być zawarte na JAVA_TOOL_OPTIONS i _JAVA_OPTIONS

Oficjalna Dokumentacja

Nie udało mi się znaleźć żadnej dokumentacji _JAVA_OPTIONS. dokumentacja dla JAVA_TOOL_OPTIONS nie rzuca zbyt wiele światła na różnicę: {]}

Ponieważ wiersz poleceń nie zawsze może być dostępny lub modyfikowany, na przykład w maszynach wirtualnych osadzonych lub po prostu maszynach wirtualnych uruchomionych głęboko w skryptach, dostępna jest zmienna JAVA_TOOL_OPTIONS, aby w takich przypadkach można było uruchomić agentów.
...

Przykładowy skrypt

To jest kod, którego użyłem, aby to rozgryźć. Wyjście konsoli jest dołączone jako komentarze:

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
Author: Community, 2015-02-04

3 answers

Masz dość dużo przybity go z wyjątkiem tego, że te opcje są pobierane nawet jeśli uruchomisz JVM w procesie poprzez wywołanie biblioteki.

Fakt, że _JAVA_OPTIONS nie jest udokumentowany sugeruje, że nie zaleca się używania tej zmiennej, a ja widziałem, jak ludzie nadużywają jej, ustawiając ją w swoich ~/.bashrc. Jeśli jednak chcesz dotrzeć do sedna tego problemu, możesz sprawdzić źródło Oracle HotSpot VM (np. w openjdk7 ).

Należy również pamiętać, że nie ma gwarancja obsługi nieudokumentowanych zmiennych przez inne maszyny wirtualne.

Aktualizacja 2015-08-04: aby zaoszczędzić pięć minut dla ludzi pochodzących z wyszukiwarek, _JAVA_OPTIONS przebija argumenty wiersza poleceń, które z kolei przebiją JAVA_TOOL_OPTIONS.

 32
Author: mkalkov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-14 12:30:40

Jest jeszcze jedna różnica: _JAVA_OPTIONS jest specyficzna dla Oracle. IBM JVM używa zamiast tego IBM_JAVA_OPTIONS. Zostało to prawdopodobnie zrobione, aby móc definiować opcje specyficzne dla maszyny bez kolizji. {[2] } jest rozpoznawany przez wszystkie maszyny wirtualne.

 18
Author: Victor Havin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-05 23:55:30

JAVA_OPTS mieć żadnej specjalnej obsługi W JVM w ogóle.

I zgodnie z https://bugs.openjdk.java.net/browse/JDK-4971166 {[1] } jest zawarty w standardowej specyfikacji JVMTI, lepiej radzi sobie z cytowanymi spacjami i powinien być zawsze preferowany od nieudokumentowanych hotspotów specyficznych dla _JAVA_OPTIONS.

Uważaj również na to, że używając tych wypisujesz na stdout dodatkową wiadomość, której nie da się ukryć.

 8
Author: Vadzim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-13 10:22:10