_JAVA_OPTIONS、JAVA_TOOL_OPTIONS和JAVA_OPTS之间的区别示例脚本

2022-08-31 06:08:57

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

JAVA_OPTS为完整起见,已包含。它不是JVM的一部分,但是在野外有很多关于它的问题。

我所知道的:

到目前为止,我发现:

  • JAVA_OPTS不是由JDK使用的,而是由许多其他应用程序使用的(请参阅此帖子)。
  • 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_OPTIONSjavajavac)
  • 对可以包含在 和 上的内容的任何限制JAVA_TOOL_OPTIONS_JAVA_OPTIONS

官方文档

我无法找到有关 的任何文档。JAVA_TOOL_OPTIONS的文档并没有对差异进行太多的阐述:_JAVA_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

答案 1

您已经差不多解决了这个问题,除了即使您通过库调用在进程中启动JVM,也会选择这些选项。

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

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

2015-08-04更新:为了给来自搜索引擎的人节省五分钟的时间,胜过命令行论点,而命令行论点又胜过。_JAVA_OPTIONSJAVA_TOOL_OPTIONS


答案 2

还有一个区别:Oracle是特定于Oracle的。IBM JVM 正在改用。这样做可能是为了能够在不发生冲突的情况下定义特定于计算机的选项。 被所有 VM 识别。_JAVA_OPTIONSIBM_JAVA_OPTIONSJAVA_TOOL_OPTIONS


推荐