Saya pikir akan lebih baik memiliki perbandingan antara _JAVA_OPTIONS
dan JAVA_TOOL_OPTIONS
. Saya telah mencari sedikit untuk satu, tetapi saya tidak dapat menemukan apa pun, jadi saya berharap kita dapat menemukan pengetahuan di sini di Stackoverflow.
JAVA_OPTS
termasuk untuk kelengkapan. Ini bukan bagian dari JVM, tetapi ada banyak pertanyaan tentang itu di alam liar.
Apa yang saya tahu:
Sejauh ini saya telah mengetahui bahwa:
JAVA_OPTS
tidak digunakan oleh JDK, tetapi oleh sekelompok aplikasi lain (lihat posting ini ).JAVA_TOOL_OPTIONS
dan_JAVA_OPTIONS
merupakan cara untuk menentukan argumen JVM sebagai variabel lingkungan alih-alih parameter baris perintah.- Paling tidak dijemput oleh
java
danjavac
- Mereka memiliki presedensi ini:
_JAVA_OPTIONS
(menimpa yang lain)- Parameter baris perintah
JAVA_TOOL_OPTIONS
(ditimpa oleh yang lain)
- Paling tidak dijemput oleh
Apa yang ingin saya ketahui
- Apakah ada dokumentasi resmi yang membandingkan
JAVA_TOOL_OPTIONS
dan_JAVA_OPTIONS
- Apakah ada perbedaan lain antara
JAVA_TOOL_OPTIONS
dan_JAVA_OPTIONS
(kecuali dari yang diutamakan). - Yang dapat dieksekusi mengambil
JAVA_TOOL_OPTIONS
dan_JAVA_OPTIONS
(selainjava
danjavac
) - Setiap batasan pada apa yang dapat dimasukkan
JAVA_TOOL_OPTIONS
dan_JAVA_OPTIONS
Dokumentasi Resmi
Saya belum dapat menemukan dokumentasi tentang _JAVA_OPTIONS
. Dokumentasi untukJAVA_TOOL_OPTIONS
tidak menjelaskan banyak perbedaan:
Karena baris perintah tidak selalu dapat diakses atau dimodifikasi, misalnya dalam VM tertanam atau hanya VM diluncurkan jauh di dalam skrip, variabel JAVA_TOOL_OPTIONS disediakan sehingga agen dapat diluncurkan dalam kasus ini.
...
Contoh skrip
Ini adalah kode yang saya gunakan untuk mencari tahu. Output konsol disertakan sebagai komentar:
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
sumber
JDK_JAVA_OPTIONS
sebagai pengganti yang disukai, lihat stackoverflow.com/q/52986487/537554Jawaban:
Anda telah memakukannya kecuali bahwa opsi ini diambil bahkan jika Anda memulai JVM dalam proses melalui panggilan perpustakaan.
Fakta yang
_JAVA_OPTIONS
tidak didokumentasikan menunjukkan bahwa tidak disarankan untuk menggunakan variabel ini, dan saya benar-benar melihat orang menyalahgunakannya dengan mengaturnya di variabel mereka~/.bashrc
. Namun, jika Anda ingin menyelesaikan masalah ini, Anda dapat memeriksa sumber Oracle HotSpot VM (mis. Di OpenJDK7 ).Anda juga harus ingat bahwa tidak ada jaminan yang dimiliki VM lain atau akan terus memiliki dukungan untuk variabel tidak berdokumen.
UPDATE 2015-08-04: Untuk menghemat lima menit untuk orang-orang yang datang dari mesin pencari,
_JAVA_OPTIONS
mengalahkan argumen baris perintah, yang pada gilirannya trufJAVA_TOOL_OPTIONS
.sumber
Ada satu perbedaan lagi:
_JAVA_OPTIONS
spesifik Oracle. IBM JVM menggunakanIBM_JAVA_OPTIONS
sebagai gantinya. Ini mungkin dilakukan untuk dapat menentukan opsi spesifik mesin tanpa tabrakan.JAVA_TOOL_OPTIONS
diakui oleh semua VM.sumber
JAVA_OPTS
tidak memiliki penanganan khusus di JVM sama sekali.Dan menurut https://bugs.openjdk.java.net/browse/JDK-4971166 yang
JAVA_TOOL_OPTIONS
termasuk dalam spesifikasi standar JVMTI, melakukan penanganan yang lebih baik dari ruang yang dikutip dan harus selalu lebih disukai daripada Hotspot khusus yang tidak berdokumen_JAVA_OPTIONS
.Hati-hati juga bahwa menggunakan ini mencetak pesan tambahan ke stdout yang tidak dapat ditekan .
Seperti yang dicatat oleh @ryenus, sejak JDK 9+, ada JDK_JAVA_OPTIONS sebagai pengganti yang disukai, lihat Apa perbedaan antara JDK_JAVA_OPTIONS dan JAVA_TOOL_OPTIONS saat menggunakan Java 11?
sumber