_JAVA_OPTIONS、JAVA_TOOL_OPTIONS 和 JAVA_OPTS 之间的区别

新手上路,请多包涵

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

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 之间是否还有其他差异(优先级除外)。
  • Which executables pick up JAVA_TOOL_OPTIONS and _JAVA_OPTIONS (in addition to java and javac )
  • 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

原文由 Tobber 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.8k
2 个回答

您几乎已经确定了它,除了即使您通过库调用在进程中启动 JVM 也会选择这些选项。

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

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

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

原文由 mkalkov 发布,翻译遵循 CC BY-SA 4.0 许可协议

还有一个区别: _JAVA_OPTIONS 是特定于 Oracle 的。 IBM JVM 正在使用 IBM_JAVA_OPTIONS 代替。这样做可能是为了能够在不发生冲突的情况下定义特定于机器的选项。 JAVA_TOOL_OPTIONS 被所有虚拟机识别。

原文由 Victor Havin 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题