_JAVA_OPTIONS,JAVA_TOOL_OPTIONS和JAVA_OPTS之间的区别


151

我认为最好在_JAVA_OPTIONS和之间进行比较JAVA_TOOL_OPTIONS。我一直在寻找一个,但是什么也找不到,所以希望我们可以在Stackoverflow上找到相关知识。

JAVA_OPTS包括在内是为了完整性。它不是JVM的一部分,但是有很多关于它的问题。

我知道的:

到目前为止,我发现:

  • JAVA_OPTSJDK并不使用它,而是其他许多应用程序使用它(请参阅此文章)。
  • 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_OPTIONSjava以及和之外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


3
由于JDK 9+JDK_JAVA_OPTIONS成为首选替代品,请参见stackoverflow.com/q/52986487/537554
ryenus

Answers:


62

除了通过库调用启动JVM进程中的这些选项外,您几乎已经注意到了它。

_JAVA_OPTIONS没有记录的事实表明,不建议使用此变量,实际上我已经看到人们通过将其设置为来滥用它~/.bashrc。但是,如果您想深入了解此问题,可以检查Oracle HotSpot VM的来源(例如,在OpenJDK7中)。

您还应该记住,不能保证其他虚拟机已经或将继续支持未记录的变量。

更新2015-08-04:要为来自搜索引擎的人员节省五分钟,请优先使用_JAVA_OPTIONS命令行参数,而命令行参数则应优先于JAVA_TOOL_OPTIONS


36

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


21

JAVA_OPTS没有特殊的处理都在JVM。

并且根据https://bugs.openjdk.java.net/browse/JDK-4971166JAVA_TOOL_OPTIONS它包含在标准JVMTI规范中,可以更好地处理带引号的空格,因此应始终首选而不是未记录的Hotspot专用_JAVA_OPTIONS

还要注意,使用这些命令将无法抑制的其他消息打印到标准输出


正如@ryenus指出的那样,自JDK 9+起,有JDK_JAVA_OPTIONS作为首选替代品,请参阅使用Java 11时JDK_JAVA_OPTIONS和JAVA_TOOL_OPTIONS有什么区别?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.