Perbedaan antara _JAVA_OPTIONS, JAVA_TOOL_OPTIONS dan JAVA_OPTS

151

Saya pikir akan lebih baik memiliki perbandingan antara _JAVA_OPTIONSdan 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_OPTStermasuk 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_OPTStidak digunakan oleh JDK, tetapi oleh sekelompok aplikasi lain (lihat posting ini ).
  • JAVA_TOOL_OPTIONSdan _JAVA_OPTIONSmerupakan cara untuk menentukan argumen JVM sebagai variabel lingkungan alih-alih parameter baris perintah.
    • Paling tidak dijemput oleh javadanjavac
    • Mereka memiliki presedensi ini:
      1. _JAVA_OPTIONS (menimpa yang lain)
      2. Parameter baris perintah
      3. JAVA_TOOL_OPTIONS (ditimpa oleh yang lain)

Apa yang ingin saya ketahui

  • Apakah ada dokumentasi resmi yang membandingkan JAVA_TOOL_OPTIONSdan_JAVA_OPTIONS
  • Apakah ada perbedaan lain antara JAVA_TOOL_OPTIONSdan _JAVA_OPTIONS(kecuali dari yang diutamakan).
  • Yang dapat dieksekusi mengambil JAVA_TOOL_OPTIONSdan _JAVA_OPTIONS(selain javadan javac)
  • Setiap batasan pada apa yang dapat dimasukkan JAVA_TOOL_OPTIONSdan_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
Tobber
sumber
3
Dan sejak JDK 9+ , ada JDK_JAVA_OPTIONSsebagai pengganti yang disukai, lihat stackoverflow.com/q/52986487/537554
ryenus

Jawaban:

62

Anda telah memakukannya kecuali bahwa opsi ini diambil bahkan jika Anda memulai JVM dalam proses melalui panggilan perpustakaan.

Fakta yang _JAVA_OPTIONStidak 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_OPTIONSmengalahkan argumen baris perintah, yang pada gilirannya truf JAVA_TOOL_OPTIONS.

mkalkov
sumber
36

Ada satu perbedaan lagi: _JAVA_OPTIONSspesifik Oracle. IBM JVM menggunakan IBM_JAVA_OPTIONSsebagai gantinya. Ini mungkin dilakukan untuk dapat menentukan opsi spesifik mesin tanpa tabrakan. JAVA_TOOL_OPTIONSdiakui oleh semua VM.

Victor Havin
sumber
21

JAVA_OPTStidak memiliki penanganan khusus di JVM sama sekali.

Dan menurut https://bugs.openjdk.java.net/browse/JDK-4971166 yang JAVA_TOOL_OPTIONStermasuk 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?

Vadzim
sumber