我认为在_JAVA_OPTIONS和JAVA_TOOL_OPTIONS之间进行比较是很好的。 我一直在寻找一个,但我找不到任何东西,所以我希望我们能在Stackoverflow上找到知识。

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

我所知道的:

到目前为止,我发现:

JAVA_OPTS不被JDK使用,但被许多其他应用程序使用(参见这篇文章)。 JAVA_TOOL_OPTIONS和_JAVA_OPTIONS是将JVM参数指定为环境变量而不是命令行参数的方法。 至少java和javac可以接收 它们有这样的优先级: _JAVA_OPTIONS(覆盖其他选项) 命令行参数 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 in-process也会选择这些选项之外,您已经基本掌握了这些选项。

事实上,_JAVA_OPTIONS没有被记录,这表明不建议使用这个变量,而且我实际上看到有人在~/.bashrc中设置它而滥用它。然而,如果你想弄清楚这个问题,你可以检查Oracle HotSpot VM的来源(例如在OpenJDK7中)。

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

更新2015-08-04:为了给搜索引擎的人节省5分钟,_JAVA_OPTIONS胜过命令行参数,而命令行参数又胜过JAVA_TOOL_OPTIONS。

其他回答

JAVA_OPTS在JVM中根本没有特殊的处理。

根据https://bugs.openjdk.java.net/browse/JDK-4971166的说法,JAVA_TOOL_OPTIONS包含在标准JVMTI规范中,可以更好地处理带引号的空格,应该始终优先使用它,而不是没有文档记录的特定于热点的_JAVA_OPTIONS。

还要注意,使用这些打印附加消息的标准输出不能被抑制。


正如@ryenus所指出的,从JDK 9+开始,就有JDK_JAVA_OPTIONS环境变量作为首选替代品,请参阅使用Java 11时JDK_JAVA_OPTIONS和JAVA_TOOL_OPTIONS之间的区别是什么?

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

除了即使通过库调用启动JVM in-process也会选择这些选项之外,您已经基本掌握了这些选项。

事实上,_JAVA_OPTIONS没有被记录,这表明不建议使用这个变量,而且我实际上看到有人在~/.bashrc中设置它而滥用它。然而,如果你想弄清楚这个问题,你可以检查Oracle HotSpot VM的来源(例如在OpenJDK7中)。

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

更新2015-08-04:为了给搜索引擎的人节省5分钟,_JAVA_OPTIONS胜过命令行参数,而命令行参数又胜过JAVA_TOOL_OPTIONS。