jvm _JAVA_OPTIONS、JAVA_TOOL_OPTIONS和JAVA_OPTS之间的差异

ffx8fchx  于 2022-11-07  发布在  Java
关注(0)|答案(3)|浏览(162)

我想这将是伟大的有一个比较_JAVA_OPTIONSJAVA_TOOL_OPTIONS。我一直在寻找一个有点,但我没有找到任何东西,所以我希望我们可以找到这里的知识堆栈溢出。
JAVA_OPTS是为了完整性而包含在内的。它不是JVM的一部分,但在野外有很多关于它的问题。

我所知道的:

到目前为止我已经发现:

***JAVA_OPTS**不是由JDK使用,而是由一系列其他应用程序使用(请参见this post)。

1.**JAVA_TOOL_OPTIONS_JAVA_OPTIONS**是将JVM参数指定为环境变量(而不是命令行参数)的方法。

  • 至少由javajavac拾取

1.它们具有以下优先级:

  1. _JAVA_OPTIONS(覆写其他值)
    1.命令行参数
  2. JAVA_TOOL_OPTIONS(被其他项覆盖)
    我想知道的是
  • 是否有任何官方文档对JAVA_TOOL_OPTIONS_JAVA_OPTIONS进行比较
  • JAVA_TOOL_OPTIONS_JAVA_OPTIONS之间是否有其他差异(优先级除外)?
  • 哪些可执行文件拾取JAVA_TOOL_OPTIONS_JAVA_OPTIONS(除javajavac之外)
  • 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
p8h8hvxi

p8h8hvxi1#

除了这些选项被选中之外,您几乎已经完成了它,即使您通过库调用在进程中启动JVM。
_JAVA_OPTIONS未被记录的事实表明不建议使用此变量,我实际上看到有人通过在他们的~/.bashrc中设置此变量来滥用此变量。但是,如果您想彻底解决此问题,您可以检查Oracle HotSpot VM的源代码(例如in OpenJDK7)。
您还应记住,不能保证其他VM具有或将继续具有对未记录变量的支持。

**更新2015-08-04:**为了给来自搜索引擎的人保存五分钟的时间,_JAVA_OPTIONS胜过命令行参数,命令行参数反过来又胜过JAVA_TOOL_OPTIONS

pexxcrt2

pexxcrt22#

还有一个区别:_JAVA_OPTIONS是Oracle特定的。IBM JVM使用的是IBM_JAVA_OPTIONS。这样做可能是为了能够定义特定于计算机的选项而不发生冲突。所有VM都可以识别JAVA_TOOL_OPTIONS

gpnt7bae

gpnt7bae3#

JAVA_OPTS在JVM中根本没有no special handling
根据https://bugs.openjdk.java.net/browse/JDK-4971166JAVA_TOOL_OPTIONS包含在标准JVMTI规范中,可以更好地处理引用的空格,应该总是首选,而不是未记录的特定于热点的_JAVA_OPTIONS
另外要注意的是,使用这些prints additional message to stdout that can't be suppressed
正如@ryenus所指出的,从JDK 9+开始,有JDK_JAVA_OPTIONS环境变量作为首选替代,请参见What is the difference between JDK_JAVA_OPTIONS and JAVA_TOOL_OPTIONS when using Java 11?

相关问题