Pomyślałem, że byłoby wspaniale mieć porównanie między _JAVA_OPTIONS
i JAVA_TOOL_OPTIONS
. Trochę szukałem jednego, ale nic nie mogę znaleźć, więc mam nadzieję, że znajdziemy tutaj wiedzę na temat Stackoverflow.
JAVA_OPTS
jest 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_OPTS
nie jest używany przez JDK, ale przez kilka innych aplikacji (zobacz ten post ).JAVA_TOOL_OPTIONS
i_JAVA_OPTIONS
są sposobami określania argumentów JVM jako zmiennej środowiskowej zamiast parametrów wiersza poleceń.- Są odbierani przez co najmniej
java
ijavac
- Mają ten priorytet:
_JAVA_OPTIONS
(nadpisuje pozostałe)- Parametry wiersza polecenia
JAVA_TOOL_OPTIONS
(jest nadpisany przez inne)
- Są odbierani przez co najmniej
Co chciałbym wiedzieć
- 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óczjava
ijavac
) - Wszelkie ograniczenia dotyczące tego, co można włączyć do
JAVA_TOOL_OPTIONS
i_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
źródło
JDK_JAVA_OPTIONS
preferowany zamiennik, patrz stackoverflow.com/q/52986487/537554Odpowiedzi:
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_OPTIONS
nie 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_OPTIONS
priorytet nad argumentami wiersza poleceń, które z kolei są atutemJAVA_TOOL_OPTIONS
.źródło
Jest jeszcze jedna różnica:
_JAVA_OPTIONS
jest specyficzna dla Oracle.IBM_JAVA_OPTIONS
Zamiast tego używa IBM JVM . Prawdopodobnie zostało to zrobione, aby móc zdefiniować opcje specyficzne dla maszyny bez kolizji.JAVA_TOOL_OPTIONS
jest rozpoznawany przez wszystkie maszyny wirtualne.źródło
JAVA_OPTS
mieć żadnego specjalnego traktowania w JVM w ogóle.I zgodnie z https://bugs.openjdk.java.net/browse/JDK-4971166
JAVA_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?
źródło