ความแตกต่างระหว่าง _JAVA_OPTIONS, JAVA_TOOL_OPTIONS และ JAVA_OPTS


151

ฉันคิดว่ามันจะดีที่จะมีการเปรียบเทียบระหว่างและ_JAVA_OPTIONS JAVA_TOOL_OPTIONSฉันค้นหามาซักพักหนึ่งแล้ว แต่ฉันไม่สามารถหาอะไรได้เลยฉันหวังว่าเราจะสามารถค้นหาความรู้ได้ที่นี่ใน Stackoverflow

JAVA_OPTSถูกรวมไว้เพื่อความสมบูรณ์ มันไม่ได้เป็นส่วนหนึ่งของ JVM แต่มีคำถามมากมายเกี่ยวกับเรื่องนี้ในป่า

สิ่งที่ฉันรู้:

จนถึงตอนนี้ฉันได้พบว่า:

  • JAVA_OPTSไม่ได้ใช้โดย JDK แต่เป็นแอพอื่น ๆ (ดูบทความนี้ )
  • JAVA_TOOL_OPTIONSและ_JAVA_OPTIONSเป็นวิธีในการระบุอาร์กิวเมนต์ JVM เป็นตัวแปรสภาพแวดล้อมแทนพารามิเตอร์บรรทัดคำสั่ง
    • ถูกหยิบขึ้นมาอย่างน้อยjavaและjavac
    • พวกเขามีความสำคัญนี้:
      1. _JAVA_OPTIONS (เขียนทับคนอื่น ๆ )
      2. พารามิเตอร์บรรทัดคำสั่ง
      3. JAVA_TOOL_OPTIONS (ถูกแทนที่โดยผู้อื่น)

สิ่งที่ฉันอยากรู้

  • มีเอกสารอย่างเป็นทางการใด ๆ ที่เปรียบเทียบJAVA_TOOL_OPTIONSและ_JAVA_OPTIONS
  • มีความแตกต่างอื่น ๆ ระหว่างJAVA_TOOL_OPTIONSและ_JAVA_OPTIONS(ยกเว้นจากความสำคัญ)
  • ไฟล์ที่เรียกใช้งานได้JAVA_TOOL_OPTIONSและ_JAVA_OPTIONS(นอกเหนือจากjavaและjavac)
  • ข้อ จำกัด ใด ๆ เกี่ยวกับสิ่งที่สามารถรวมอยู่ในJAVA_TOOL_OPTIONSและ_JAVA_OPTIONS

เอกสารอย่างเป็นทางการ

ฉันยังไม่ได้สามารถที่จะหาเอกสารใด ๆ _JAVA_OPTIONSเกี่ยวกับ เอกสารสำหรับJAVA_TOOL_OPTIONSไม่หลั่งน้ำตาแสงมากเกี่ยวกับความแตกต่าง:

เนื่องจากบรรทัดคำสั่งไม่สามารถเข้าถึงหรือแก้ไขได้เสมอตัวอย่างเช่นใน VMs ฝังตัวหรือเพียงแค่เปิดตัว VMs ที่อยู่ลึกลงไปในสคริปต์ตัวแปร JAVA_TOOL_OPTIONS จึงถูกจัดเตรียมไว้เพื่อให้ตัวแทนอาจเปิดใช้งานในกรณีเหล่านี้
...

สคริปต์ตัวอย่าง

นี่คือรหัสที่ฉันใช้เพื่อหาสิ่งนี้ เอาต์พุตคอนโซลถูกรวมเป็นความคิดเห็น:

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

2
เกี่ยวข้อง: stackoverflow.com/questions/17781405/…

3
และตั้งแต่JDK 9+ จะมีJDK_JAVA_OPTIONSการแทนที่ที่ต้องการดูstackoverflow.com/q/52986487/537554
ryenus

คำตอบ:


62

คุณทำได้ดีมากยกเว้นว่าตัวเลือกเหล่านี้จะถูกหยิบขึ้นมาแม้ว่าคุณจะเริ่มต้น JVM ที่อยู่ระหว่างดำเนินการผ่านการเรียกใช้ไลบรารี

ความจริงที่ว่าจะไม่ได้รับการบันทึกให้เห็นว่ามันจะไม่แนะนำให้ใช้ตัวแปรนี้และฉันได้เห็นจริงคนละเมิดโดยการตั้งค่าของพวกเขาใน_JAVA_OPTIONS ~/.bashrcอย่างไรก็ตามหากคุณต้องการทราบสาเหตุของปัญหานี้คุณสามารถตรวจสอบที่มาของ Oracle HotSpot VM (เช่นใน OpenJDK7 )

คุณควรจำไว้ว่าไม่มีการรับประกัน VM อื่น ๆ ที่มีหรือจะยังคงสนับสนุนตัวแปรที่ไม่มีเอกสาร

UPDATE 2015/08/04: หากต้องการบันทึกห้านาทีสำหรับคนที่มาจากเครื่องมือค้นหาปั้นอาร์กิวเมนต์บรรทัดคำสั่งซึ่งในทางกลับกันคนที่กล้าหาญ_JAVA_OPTIONSJAVA_TOOL_OPTIONS


36

มีข้อแตกต่างอีกประการหนึ่ง_JAVA_OPTIONSคือ Oracle เฉพาะเจาะจง IBM JVM ใช้IBM_JAVA_OPTIONSแทน นี่อาจเป็นไปได้ที่จะกำหนดตัวเลือกเฉพาะเครื่องโดยไม่มีการชนกัน JAVA_TOOL_OPTIONSได้รับการยอมรับจาก VMs ทั้งหมด


21

JAVA_OPTSมีไม่มีการจัดการพิเศษใน JVM ที่ทั้งหมด

และเป็นไปตามhttps://bugs.openjdk.java.net/browse/JDK-4971166JAVA_TOOL_OPTIONSจะรวมอยู่ในข้อกำหนด JVMTI มาตรฐานไม่ดีกว่าการจัดการของช่องว่างที่ยกมาและควรจะแนะนำเสมอแทนไม่มีเอกสาร _JAVA_OPTIONSHotspot

นอกจากนี้โปรดระวังว่าการใช้ข้อความเหล่านี้พิมพ์ข้อความเพิ่มเติมไปยัง stdout ที่ไม่สามารถระงับได้


ดังที่ @ryenus ระบุไว้ตั้งแต่ JDK 9+ มี JDK_JAVA_OPTIONS เป็นตัวเลือกที่ต้องการแทนที่ดูความแตกต่างระหว่าง JDK_JAVA_OPTIONS และ JAVA_TOOL_OPTIONS คืออะไรเมื่อใช้ Java 11?

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.