_JAVA_OPTIONS JAVA_TOOL_OPTIONS和JAVA_OPTS之间的区别

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

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

我知道的:

到目前为止,我已经发现:

  • JDK不使用JAVA_OPTS ,而是使用其他一些应用程序(请参见本文 )。
  • JAVA_TOOL_OPTIONS_JAVA_OPTIONS是将JVM参数指定为环境variables而不是命令行参数的方法。
    • 至less被javajavac拾取
    • 他们有这个优先权:
      1. _JAVA_OPTIONS (覆盖其他)
      2. 命令行参数
      3. JAVA_TOOL_OPTIONS (被其他人覆盖)

我想知道的

  • 有没有比较JAVA_TOOL_OPTIONS_JAVA_OPTIONS官方文档
  • JAVA_TOOL_OPTIONS_JAVA_OPTIONS之间是否有其他区别(优先级除外)?
  • 哪个可执行文件JAVA_TOOL_OPTIONS_JAVA_OPTIONS (除了javajavac
  • JAVA_TOOL_OPTIONS_JAVA_OPTIONS可以包含什么限制

正式文件

我一直无法find关于_JAVA_OPTIONS任何文档。 JAVA_TOOL_OPTIONS的文档并没有说明差别:

由于不能总是访问或修改命令行,例如在embedded式VM中或者在脚本内部深入启动的VM中,会提供JAVA_TOOL_OPTIONSvariables,以便在这些情况下启动代理。

示例脚本

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

 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进程,也可以select这些选项。

_JAVA_OPTIONS没有logging的事实表明不build议使用这个variables,而且我已经看到有人通过在~/.bashrc设置来滥用它。 但是,如果您想深究此问题,则可以检查Oracle HotSpot VM的源代码(例如, 在OpenJDK7中 )。

您还应该记住,不能保证其他虚拟机已经或将继续支持无证variables。

UPDATE 2015-08-04:为了节省五分钟来自search引擎的人员, _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_OPTIONS的特定于热点的_JAVA_OPTIONS

另外请注意,使用这些打印额外的消息到不能被压制的标准输出 。