Sự khác biệt giữa _JAVA_OPTIONS, JAVA_TOOL_OPTIONS và JAVA_OPTS


151

Tôi nghĩ rằng nó sẽ là tuyệt vời để có một so sánh giữa _JAVA_OPTIONSJAVA_TOOL_OPTIONS. Tôi đã tìm kiếm một chút cho một, nhưng tôi không thể tìm thấy bất cứ điều gì, vì vậy tôi hy vọng chúng ta có thể tìm thấy kiến ​​thức ở đây trên Stackoverflow.

JAVA_OPTSđược bao gồm cho sự hoàn chỉnh. Nó không phải là một phần của JVM, nhưng có rất nhiều câu hỏi về nó ngoài tự nhiên.

Những gì tôi biết:

Cho đến nay tôi đã phát hiện ra rằng:

  • JAVA_OPTSkhông được JDK sử dụng, mà bởi một loạt các ứng dụng khác (xem bài đăng này ).
  • JAVA_TOOL_OPTIONS_JAVA_OPTIONSlà các cách để xác định các đối số JVM như một biến môi trường thay vì các tham số dòng lệnh.
    • Chúng được nhặt bởi ít nhất javajavac
    • Họ có quyền ưu tiên này:
      1. _JAVA_OPTIONS (ghi đè lên những người khác)
      2. Tham số dòng lệnh
      3. JAVA_TOOL_OPTIONS (bị ghi đè bởi những người khác)

Những gì tôi muốn biết

  • Có tài liệu chính thức nào so sánh không JAVA_TOOL_OPTIONS_JAVA_OPTIONS
  • Có sự khác biệt nào khác giữa JAVA_TOOL_OPTIONS_JAVA_OPTIONS(ngoại trừ từ quyền ưu tiên).
  • Những tập tin thực thi nào nhận JAVA_TOOL_OPTIONS_JAVA_OPTIONS(ngoài javajavac)
  • Bất kỳ giới hạn về những gì có thể được bao gồm trên JAVA_TOOL_OPTIONS_JAVA_OPTIONS

Tài liệu chính thức

Tôi đã không thể tìm thấy bất kỳ tài liệu về _JAVA_OPTIONS. Các tài liệu choJAVA_TOOL_OPTIONS không làm sáng tỏ sự khác biệt:

Do dòng lệnh không thể luôn luôn được truy cập hoặc sửa đổi, ví dụ như trong các máy ảo nhúng hoặc đơn giản là các máy ảo được khởi chạy sâu bên trong các tập lệnh, một biến JAVA_TOOL_OPTIONS được cung cấp để các tác nhân có thể được khởi chạy trong các trường hợp này.
...

Kịch bản ví dụ

Đây là mã tôi đã sử dụng để tìm ra điều này. Đầu ra giao diện điều khiển được bao gồm dưới dạng nhận xét:

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
Và kể từ JDK 9+ , có JDK_JAVA_OPTIONSsự thay thế ưa thích, hãy xem stackoverflow.com/q/52986487/537554
ryenus

Câu trả lời:


62

Bạn đã đóng đinh khá nhiều ngoại trừ các tùy chọn này được chọn ngay cả khi bạn bắt đầu xử lý JVM thông qua một cuộc gọi thư viện.

Thực tế _JAVA_OPTIONSkhông được ghi nhận cho thấy rằng không nên sử dụng biến này và tôi thực sự đã thấy mọi người lạm dụng nó bằng cách đặt nó vào ~/.bashrc. Tuy nhiên, nếu bạn muốn tìm hiểu sâu về vấn đề này, bạn có thể kiểm tra nguồn của Oracle HotSpot VM (ví dụ: trong OpenJDK7 ).

Bạn cũng nên nhớ rằng không có gì đảm bảo các máy ảo khác có hoặc sẽ tiếp tục có hỗ trợ cho các biến không có giấy tờ.

CẬP NHẬT 2015-08-04: Để tiết kiệm năm phút cho những người đến từ các công cụ tìm kiếm, bỏ _JAVA_OPTIONSqua các đối số dòng lệnh, lần lượt là át chủ bài JAVA_TOOL_OPTIONS.


36

Có một sự khác biệt nữa: _JAVA_OPTIONSlà cụ thể của Oracle. IBM JVM đang sử dụng IBM_JAVA_OPTIONSthay thế. Điều này có lẽ đã được thực hiện để có thể xác định các tùy chọn dành riêng cho máy mà không bị va chạm. JAVA_TOOL_OPTIONSđược công nhận bởi tất cả các máy ảo.


21

JAVA_OPTSkhông xử lý đặc biệt trong JVM ở tất cả.

Và theo https://bugs.openjdk.java.net/browse/JDK-4971166 , JAVA_TOOL_OPTIONSnó được bao gồm trong đặc tả JVMTI tiêu chuẩn, xử lý tốt hơn các không gian được trích dẫn và luôn luôn được ưu tiên thay vì Hotspot cụ thể _JAVA_OPTIONS.

Ngoài ra, hãy cẩn thận khi sử dụng các bản in này thông báo bổ sung cho thiết bị xuất chuẩn không thể bị chặn .


Như @ryenus đã lưu ý, kể từ JDK 9+, có JDK_JAVA_OPTIONS là sự thay thế ưa thích, hãy xem sự khác biệt giữa JDK_JAVA_OPTIONS và JAVA_TOOL_OPTIONS khi sử dụng Java 11 là gì?

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.