[java] _JAVA_OPTIONS, JAVA_TOOL_OPTIONS 및 JAVA_OPTS의 차이점

나는 간의 비교 가지고 좋은 것 생각 _JAVA_OPTIONSJAVA_TOOL_OPTIONS. 하나를 조금 찾고 있지만 아무것도 찾을 수 없으므로 여기에서 Stackoverflow에 대한 지식을 찾을 수 있기를 바랍니다.

JAVA_OPTS완전성을 위해 포함되어 있습니다. JVM의 일부는 아니지만 실제로는 많은 질문이 있습니다.

내가 아는데 것을:

지금까지 나는 그것을 발견했다.

  • JAVA_OPTSJDK가 아니라 다른 많은 앱에서 사용됩니다 ( 이 게시물 참조 ).
  • JAVA_TOOL_OPTIONS그리고 _JAVA_OPTIONS대신에 명령 줄 매개 변수의 환경 변수로 JVM 인수를 지정하는 방법입니다.
    • 이 적어도에 의해 선택됩니다 javajavac
    • 그들은이 우선권을 가지고 있습니다 :
      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 는 차이점에 대해 많은 것을 밝히지 않았습니다.

예를 들어 내장 VM 또는 단순히 스크립트 내에서 시작된 VM과 같은 명령 줄에 항상 액세스하거나 수정할 수 없으므로 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



답변

라이브러리 호출을 통해 프로세스 내에서 JVM을 시작하더라도 이러한 옵션이 선택된다는 점을 제외하고는 거의 문제가되지 않았습니다.

_JAVA_OPTIONS문서화되지 않은 사실 은이 변수를 사용하지 않는 것이 좋습니다. 실제로 사람들이 변수를에 설정하여 악용하는 것을 보았습니다 ~/.bashrc. 그러나이 문제를 해결하려면 Oracle HotSpot VM의 소스를 확인할 수 있습니다 (예 : OpenJDK7 ).

또한 다른 VM이 문서화되지 않은 변수를 지원하거나 계속 지원한다는 보장은 없습니다.

2015-08-04 업데이트 : 검색 엔진에서 오는 사람들을 위해 5 분을 절약하기 위해 _JAVA_OPTIONS명령 줄 인수보다 우선 JAVA_TOOL_OPTIONS합니다.


답변

차이점은 하나 더 있습니다. _JAVA_OPTIONSOracle에 따라 다릅니다. IBM JVM이 IBM_JAVA_OPTIONS대신 사용 중입니다. 이것은 충돌없이 머신 별 옵션을 정의 할 수 있도록하기위한 것입니다. JAVA_TOOL_OPTIONS모든 VM에서 인식됩니다.


답변

JAVA_OPTS특별한 취급없다JVM에서 .

그리고에 따라 https://bugs.openjdk.java.net/browse/JDK-4971166JAVA_TOOL_OPTIONS더 인용 공간의 취급 않으며, 대신 항상 문서화되지 않은 핫스팟 특정의 바람직한한다 표준 JVMTI 사양에 포함되어 있습니다 _JAVA_OPTIONS.

또한 이들을 사용하면 억제 할 수없는 추가 메시지가 stdout에 인쇄 됩니다.


@ryenus가 지적했듯이 JDK 9 이상부터 JDK_JAVA_OPTIONS가 선호되는 대체품 입니다. Java 11을 사용할 때 JDK_JAVA_OPTIONS와 JAVA_TOOL_OPTIONS의 차이점무엇입니까?를 참조하십시오 .


답변