_JAVA_OPTIONS、JAVA_TOOL_OPTIONS 和 JAVA_OPTS 之间的区别
Difference between _JAVA_OPTIONS, JAVA_TOOL_OPTIONS and JAVA_OPTS
我认为比较 _JAVA_OPTIONS
和 JAVA_TOOL_OPTIONS
会很棒。
我一直在寻找一个,但我找不到任何东西,所以我希望我们能在 Whosebug 上找到这些知识。
JAVA_OPTS
包含在内是为了完整性。它不是 JVM 的一部分,但在野外有很多关于它的问题。
我知道的:
到目前为止我发现:
JAVA_OPTS
未被 JDK 使用,但被许多其他应用程序使用(参见 this post)。
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
的文档。 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-4971166,JAVA_TOOL_OPTIONS
包含在标准 JVMTI 规范中,可以更好地处理引用的空格,并且应该始终首选而不是未记录的 Hotspot-specific _JAVA_OPTIONS
。
还要注意使用这些 prints additional message to stdout that can't be suppressed。
正如@ryenus 指出的那样,自 JDK 9+ 以来,JDK_JAVA_OPTIONS 是首选替代品,请参阅
我认为比较 _JAVA_OPTIONS
和 JAVA_TOOL_OPTIONS
会很棒。
我一直在寻找一个,但我找不到任何东西,所以我希望我们能在 Whosebug 上找到这些知识。
JAVA_OPTS
包含在内是为了完整性。它不是 JVM 的一部分,但在野外有很多关于它的问题。
我知道的:
到目前为止我发现:
JAVA_OPTS
未被 JDK 使用,但被许多其他应用程序使用(参见 this post)。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
的文档。 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-4971166,JAVA_TOOL_OPTIONS
包含在标准 JVMTI 规范中,可以更好地处理引用的空格,并且应该始终首选而不是未记录的 Hotspot-specific _JAVA_OPTIONS
。
还要注意使用这些 prints additional message to stdout that can't be suppressed。
正如@ryenus 指出的那样,自 JDK 9+ 以来,JDK_JAVA_OPTIONS 是首选替代品,请参阅