_JAVA_OPTIONS、JAVA_TOOL_OPTIONS 和 JAVA_OPTS 之间的区别

Difference between _JAVA_OPTIONS, JAVA_TOOL_OPTIONS and JAVA_OPTS

我认为比较 _JAVA_OPTIONSJAVA_TOOL_OPTIONS 会很棒。 我一直在寻找一个,但我找不到任何东西,所以我希望我们能在 Whosebug 上找到这些知识。

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

我知道的:

到目前为止我发现:

我想知道的

官方文档

我找不到任何关于 _JAVA_OPTIONS 的文档。 The documentation for JAVA_TOOL_OPTIONS 并没有说明区别:

Since the command-line cannot always be accessed or modified, for example in embedded VMs or simply VMs launched deep within scripts, a JAVA_TOOL_OPTIONS variable is provided so that agents may be launched in these cases.
...

示例脚本

这是我用来解决这个问题的代码。控制台输出包含在注释中:

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 的来源(例如 in OpenJDK7)。

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

更新 2015-08-04: 为了为来自搜索引擎的人们节省五分钟,_JAVA_OPTIONS 胜过命令行参数,后者又胜过 JAVA_TOOL_OPTIONS.

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

JAVA_OPTS 在 JVM 中有 no special handling

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

还要注意使用这些 prints additional message to stdout that can't be suppressed


正如@ryenus 指出的那样,自 JDK 9+ 以来,JDK_JAVA_OPTIONS 是首选替代品,请参阅