_JAVA_OPTIONS JAVA_TOOL_OPTIONS和JAVA_OPTS之间的区别

Tob*_*ber 120 java jvm jvm-arguments

我认为在_JAVA_OPTIONS和之间进行比较会很棒JAVA_TOOL_OPTIONS.我一直在寻找一个,但我找不到任何东西,所以我希望我们能在Stackoverflow上找到这方面的知识.

JAVA_OPTS包括完整性.它不是JVM的一部分,但在野外有很多问题.

我知道的:

到目前为止,我发现:

  • JAVA_OPTSJDK不使用它,而是由许多其他应用程序使用(请参阅此文章).
  • 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.该文件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
Run Code Online (Sandbox Code Playgroud)

mka*_*kov 52

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

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

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

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

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

小智 30

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


Vad*_*zim 15

JAVA_OPTS没有特殊的处理在JVM的.

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

还要注意使用这些打印附加消息到无法抑制的stdout.