_JAVA_OPTIONS、JAVA_TOOL_OPTIONS 和 JAVA_OPTS 之间的区别

Posted

技术标签:

【中文标题】_JAVA_OPTIONS、JAVA_TOOL_OPTIONS 和 JAVA_OPTS 之间的区别【英文标题】:Difference between _JAVA_OPTIONS, JAVA_TOOL_OPTIONS and JAVA_OPTS 【发布时间】:2015-04-04 08:14:30 【问题描述】:

我认为在_JAVA_OPTIONSJAVA_TOOL_OPTIONS 之间进行比较会很棒。 我一直在寻找一个,但我找不到任何东西,所以我希望我们可以在 *** 上找到知识。

JAVA_OPTS 包含在内以确保完整性。它不是 JVM 的一部分,但有很多关于它的问题。

我知道的:

到目前为止,我发现:

JAVA_OPTS 不被 JDK 使用,而是被许多其他应用程序使用(参见 this post)。 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 的文档。 The documentation for JAVA_TOOL_OPTIONS 并没有说明差异:

由于不能始终访问或修改命令行,例如在嵌入式 VM 或仅在脚本深处启动的 VM 中,因此提供了 JAVA_TOOL_OPTIONS 变量,以便在这些情况下可以启动代理。 ...

示例脚本

这是我用来解决这个问题的代码。控制台输出包含为 cmets:

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

【问题讨论】:

相关:***.com/questions/17781405/… JDK 9+ 开始,JDK_JAVA_OPTIONS 作为首选替代品,请参阅***.com/q/52986487/537554 【参考方案1】:

除了这些选项,即使您通过库调用在进程中启动 JVM,您也已经非常成功了。

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

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

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

【讨论】:

很抱歉,作为一个非英语母语人士,“_JAVA_OPTIONS 胜过命令行参数,而命令行参数又胜过 JAVA_TOOL_OPTIONS”是什么意思非常不清楚。 @yang-yang 在这种情况下,“王牌”的意思是“优先于”。因此,如果 _JAVA_OPTIONS="-Dfoo=bar" 和 JAVA_TOOL_OPTIONS="-Dfoo=sna" 最终结果将是 System.getProperty("foo") 将返回 "bar"。【参考方案2】:

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

【讨论】:

【参考方案3】:

JAVA_OPTS 在 JVM 中完全有 no special handling。

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

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


正如@ryenus 所说,自 JDK 9+ 起,JDK_JAVA_OPTIONS 作为首选替代品,请参阅What is the difference between JDK_JAVA_OPTIONS and JAVA_TOOL_OPTIONS when using Java 11?

【讨论】:

以上是关于_JAVA_OPTIONS、JAVA_TOOL_OPTIONS 和 JAVA_OPTS 之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

_JAVA_OPTIONS、JAVA_TOOL_OPTIONS 和 JAVA_OPTS 之间的区别

_JAVA_OPTIONS、JAVA_TOOL_OPTIONS 和 JAVA_OPTS 之间的区别

安装了QTP导致eclipse打不开问题

weblogic 乱码

weblogic JMX配置后,受管服务无法启动,报端口被占用,请支招!

weblogic抛出Platform MBeanServer异常