关于java:_JAVA_OPTIONS JAVA_TOOL_OPTIONS与JAVA_OPTS之间的区别

Difference between _JAVA_OPTIONS JAVA_TOOL_OPTIONS and JAVA_OPTS

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

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

我知道的:

到目前为止,我发现:

  • JDK不使用JAVA_OPTS,而是其他许多应用程序使用JAVA_OPTS(请参阅此文章)。
  • JAVA_TOOL_OPTIONS_JAVA_OPTIONS是将JVM参数指定为环境变量而不是命令行参数的方法。

    • 至少由javajavac拾取
    • 它们具有以下优先级:

    • _JAVA_OPTIONS(覆盖其他)
    • 命令行参数
    • 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的文档并没有太多说明区别:

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. ...

示例脚本

这是我用来弄清楚的代码。控制台输出作为注释包括在内:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
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:为了为来自搜索引擎的人们节省五分钟,_JAVA_OPTIONS胜过命令行参数,而命令行参数又胜过JAVA_TOOL_OPTIONS


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


JAVA_OPTS在JVM中完全没有特殊处理。

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

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