_JAVA_OPTIONS JAVA_TOOL_OPTIONS和JAVA_OPTS之间的区别

时间:2015-02-04 17:26:54

标签: java jvm jvm-arguments

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

包含

JAVA_OPTS是为了完整性。它不是JVM的一部分,但在野外有很多问题。

我所知道的:

到目前为止,我发现了:

    JDK不使用
  • JAVA_OPTS ,而是使用其他一些应用程序(请参阅this post)。
  • JAVA_TOOL_OPTIONS _JAVA_OPTIONS 是将JVM参数指定为环境变量而非命令行参数的方法。
    • 至少会被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
  • 中可包含的内容有任何限制

官方文件

我无法找到有关_JAVA_OPTIONS的任何文档。 The documentation for 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

3 个答案:

答案 0 :(得分:41)

除非你通过库调用在进程中启动JVM,否则你已经接受了这些选项。

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

您还应该记住,无法保证其他虚拟机已经或将继续支持未记录的变量。

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

答案 1 :(得分:23)

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

答案 2 :(得分:11)

JAVA_OPTS在JVM中只有no special handling

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

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