Różnica między _JAVA_OPTIONS, JAVA_TOOL_OPTIONS i JAVA_OPTS

151

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

JAVA_OPTSjest dołączony dla kompletności. Nie jest częścią JVM, ale w środowisku naturalnym pojawia się wiele pytań na ten temat.

Co wiem:

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

  • JAVA_OPTSnie jest używany przez JDK, ale przez kilka innych aplikacji (zobacz ten post ).
  • JAVA_TOOL_OPTIONSi _JAVA_OPTIONSsą sposobami określania argumentów JVM jako zmiennej środowiskowej zamiast parametrów wiersza poleceń.
    • Są odbierani przez co najmniej javaijavac
    • Mają ten priorytet:
      1. _JAVA_OPTIONS (nadpisuje pozostałe)
      2. Parametry wiersza polecenia
      3. JAVA_TOOL_OPTIONS (jest nadpisany przez inne)

Co chciałbym wiedzieć

  • Czy jest jakaś oficjalna dokumentacja porównująca JAVA_TOOL_OPTIONSi_JAVA_OPTIONS
  • Czy są jakieś inne różnice między JAVA_TOOL_OPTIONSi _JAVA_OPTIONS(z wyjątkiem pierwszeństwa).
  • Które pliki wykonywalne pobierają JAVA_TOOL_OPTIONSi _JAVA_OPTIONS(oprócz javai javac)
  • Wszelkie ograniczenia dotyczące tego, co można włączyć do JAVA_TOOL_OPTIONSi_JAVA_OPTIONS

Oficjalna dokumentacja

Nie udało mi się znaleźć żadnej dokumentacji na temat _JAVA_OPTIONS. Dokumentacja dlaJAVA_TOOL_OPTIONS nie rzuca dużo światła na różnicę:

Ponieważ nie zawsze można uzyskać dostęp do wiersza polecenia lub go zmodyfikować, na przykład na wbudowanych maszynach wirtualnych lub po prostu maszynach wirtualnych uruchamianych głęboko w skryptach, dostępna jest zmienna JAVA_TOOL_OPTIONS, która umożliwia uruchamianie agentów w takich przypadkach.
...

Przykładowy skrypt

To jest kod, którego użyłem, aby to rozgryźć. Dane wyjściowe konsoli są dołączane 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
Tobber
źródło
3
A ponieważ JDK 9+ , istnieje JDK_JAVA_OPTIONSpreferowany zamiennik, patrz stackoverflow.com/q/52986487/537554
ryenus

Odpowiedzi:

62

Prawie udało ci się to, z wyjątkiem tego, że te opcje są wybierane nawet jeśli uruchomisz JVM w toku przez wywołanie biblioteki.

Fakt, że _JAVA_OPTIONSnie jest to udokumentowane, sugeruje, że nie jest zalecane używanie tej zmiennej, a faktycznie widziałem, jak ludzie nadużywali jej, ustawiając ją w swoich ~/.bashrc. Jeśli jednak chcesz dojść 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 gwarancji, że inne maszyny wirtualne mają lub będą obsługiwać zmienne nieudokumentowane.

AKTUALIZACJA 04.08.2015: Aby zaoszczędzić pięć minut dla osób przychodzących z wyszukiwarek, ma _JAVA_OPTIONSpriorytet nad argumentami wiersza poleceń, które z kolei są atutem JAVA_TOOL_OPTIONS.

mkalkov
źródło
36

Jest jeszcze jedna różnica: _JAVA_OPTIONSjest specyficzna dla Oracle. IBM_JAVA_OPTIONSZamiast tego używa IBM JVM . Prawdopodobnie zostało to zrobione, aby móc zdefiniować opcje specyficzne dla maszyny bez kolizji. JAVA_TOOL_OPTIONSjest rozpoznawany przez wszystkie maszyny wirtualne.

Victor Havin
źródło
21

JAVA_OPTSmieć żadnego specjalnego traktowania w JVM w ogóle.

I zgodnie z https://bugs.openjdk.java.net/browse/JDK-4971166JAVA_TOOL_OPTIONS jest w specyfikacji standardu JVMTI, ma lepsze zachowywanie ustalonych miejscach i zawsze powinny być korzystne zamiast undocumented Hotspot-specyficzny _JAVA_OPTIONS.

Uważaj również, że użycie tych drukuje dodatkowy komunikat na standardowe wyjście, którego nie można ukryć .


Jak zauważył @ryenus, od JDK 9+ preferowanym zamiennikiem jest JDK_JAVA_OPTIONS. Zobacz Jaka jest różnica między JDK_JAVA_OPTIONS i JAVA_TOOL_OPTIONS podczas korzystania z Java 11?

Vadzim
źródło