_JAVA_OPTIONS, JAVA_TOOL_OPTIONS ve JAVA_OPTS arasındaki fark


151

Bunun arasında bir karşılaştırma olması harika olacağını düşündüm _JAVA_OPTIONSve JAVA_TOOL_OPTIONS. Birini biraz arıyordum, ama hiçbir şey bulamıyorum, umarım burada Stackoverflow'da bilgi bulabiliriz.

JAVA_OPTStamlık için dahil edilmiştir. JVM'nin bir parçası değil, ancak vahşi doğada bu konuda birçok soru var.

Bildiklerim:

Şimdiye kadar öğrendim:

  • JAVA_OPTSJDK tarafından kullanılan, ancak diğer uygulamalar bir grup tarafından (bkz değil bu yayını ).
  • JAVA_TOOL_OPTIONSve _JAVA_OPTIONSJVM bağımsız değişkenlerini komut satırı parametreleri yerine ortam değişkeni olarak belirtmenin yollarıdır.
    • En azından tarafından alınır javavejavac
    • Bu önceliğe sahipler:
      1. _JAVA_OPTIONS (diğerlerinin üzerine yazar)
      2. Komut satırı parametreleri
      3. JAVA_TOOL_OPTIONS (diğerleri tarafından üzerine yazılır)

Bilmek istediklerim

  • Karşılaştırma yapan resmi belgeler var mı JAVA_TOOL_OPTIONSve_JAVA_OPTIONS
  • JAVA_TOOL_OPTIONSVe _JAVA_OPTIONS(öncelik hariç) arasında başka farklar var mı ?
  • Yürütülebilir pick up hangi JAVA_TOOL_OPTIONSve _JAVA_OPTIONS(ek olarak javave javac)
  • Nelerin dahil edilebileceği konusunda herhangi bir sınırlama JAVA_TOOL_OPTIONSve_JAVA_OPTIONS

Resmi Belgeler

İle ilgili herhangi bir belge bulamadım _JAVA_OPTIONS. İçin olan belgelerJAVA_TOOL_OPTIONS bu farka fazla ışık tutmaz:

Komut satırına her zaman erişilemeyeceği veya değiştirilemeyeceği için, örneğin gömülü VM'lerde veya yalnızca komut dosyalarının derinliklerinde başlatılan VM'lerde, bu durumlarda aracıların başlatılması için bir JAVA_TOOL_OPTIONS değişkeni sağlanır.
...

Örnek komut dosyası

Bunu anlamak için kullandığım kod bu. Konsol çıktısı yorumlar olarak eklenir:

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


3
Ve bu yana JDK 9 + , orada JDK_JAVA_OPTIONStercih yerine, bkz stackoverflow.com/q/52986487/537554
ryenus

Yanıtlar:


62

Bir kütüphane çağrısı ile işlem sırasında JVM'yi başlatsanız bile, bu seçeneklerin alınması dışında hemen hemen çivilenmişsinizdir.

_JAVA_OPTIONSBelgelenmemiş gerçek, bu değişkeni kullanmanın önerilmediğini gösterir ve aslında insanların bunu ayarlayarak kötüye kullandıklarını gördüm ~/.bashrc. Ancak, bu sorunun en altına inmek istiyorsanız, Oracle HotSpot VM'nin kaynağını kontrol edebilirsiniz (örn . OpenJDK7'de ).

Ayrıca, diğer VM'lerin belgelenmemiş değişkenler için desteğe sahip olduğunu veya desteklemeye devam edeceğini garanti etmediğini de unutmamalısınız.

GÜNCELLEME 2015-08-04: Arama motorlarından gelen insanlar için beş dakika tasarruf etmek için, _JAVA_OPTIONSkomut satırı argümanlarını çöker ve bu da koz olur JAVA_TOOL_OPTIONS.


36

Bir fark daha var: _JAVA_OPTIONSOracle'a özgü. IBM JVM IBM_JAVA_OPTIONSbunun yerine kullanıyor . Bu muhtemelen, çarpışma olmadan makineye özgü seçenekleri tanımlamak için yapıldı. JAVA_TOOL_OPTIONStüm VM'ler tarafından tanınır.


21

JAVA_OPTSsahip hiçbir özel işlem hiç JVM.

Ve göre https://bugs.openjdk.java.net/browse/JDK-4971166JAVA_TOOL_OPTIONS , daha alıntı boşlukların taşıma etmez ve her zaman yerine kayıt dışı Noktası-spesifik tercih edilmelidir standart JVMTI tarifnamede dahildir _JAVA_OPTIONS.

Ayrıca, bu baskıların kullanılmasının , bastırılamayan stdout'a ek mesajlar verdiğine dikkat edin .


@Ryenus'un belirttiği gibi, JDK 9+'dan beri tercih edilen değiştirme olarak JDK_JAVA_OPTIONS var, bkz. Java 11 kullanırken JDK_JAVA_OPTIONS ve JAVA_TOOL_OPTIONS arasındaki fark nedir?

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.