_JAVA_OPTIONS, JAVA_TOOL_OPTIONS, and JAVA_OPTS are all environment variables used in Java applications to set additional options and parameters for the Java Virtual Machine (JVM) during runtime. _JAVA_OPTIONS is an environment variable that allows users
_JAVA_OPTIONS, JAVA_TOOL_OPTIONS, and JAVA_OPTS are all environment variables used in Java applications to set additional options and parameters for the Java Virtual Machine (JVM) during runtime. _JAVA_OPTIONS is an environment variable that allows users
我认为对_JAVA_OPTIONS
和JAVA_TOOL_OPTIONS
进行比较是很好的。\n我已经搜索了一些内容,但是没有找到任何东西,所以希望我们能在Stackoverflow上找到答案。\n为了完整起见,JAVA_OPTS
也包括在内。它不是JVM的一部分,但在外界有很多关于它的问题。\n
我所了解的:
\n到目前为止,我已经发现:\n
- \n
JAVA_OPTS
不被JDK使用,而是被一些其他应用程序使用(见此帖子)。JAVA_TOOL_OPTIONS
和_JAVA_OPTIONS
是用环境变量而不是命令行参数来指定JVM参数的方法。\n- \n
- 至少有
java
和javac
支持 - 它们的优先级如下:\n
- \n
_JAVA_OPTIONS
(覆盖其他选项)- 命令行参数
JAVA_TOOL_OPTIONS
(被其他选项覆盖)
\n
\n
\n
\n
\n
- 至少有
\n
\n
\n
我想知道的:
\n
- \n
- 是否有任何官方文档比较了
JAVA_TOOL_OPTIONS
和_JAVA_OPTIONS
JAVA_TOOL_OPTIONS
和_JAVA_OPTIONS
之间是否有其他差异(除了优先级)。- 除了
java
和javac
之外,哪些可执行程序支持JAVA_TOOL_OPTIONS
和_JAVA_OPTIONS
JAVA_TOOL_OPTIONS
和_JAVA_OPTIONS
中是否存在任何限制
\n
\n
\n
\n
\n
官方文档
\n我没有找到任何关于_JAVA_OPTIONS
的文档。JAVA_TOOL_OPTIONS
的文档没有提供太多关于差异的信息:\n
\n由于无法始终访问或修改命令行,例如在嵌入式VM或在脚本中启动的VM中,提供了一个JAVA_TOOL_OPTIONS变量,以便在这些情况下启动代理。
...\n
\n
示例脚本
\n这是我用来弄清楚这个问题的代码。控制台输出作为注释包含在内:\n
export JAVA_OPTS=foobar export JAVA_TOOL_OPTIONS= export _JAVA_OPTIONS="-Xmx512m -Xms64m" java -version # 检测到JAVA_TOOL_OPTIONS: # 检测到_JAVA_OPTIONS:-Xmx512m -Xms64m # java版本 "1.7.0_40" OpenJDK运行时环境(IcedTea 2.4.1)(suse-3.41.1-x86_64) OpenJDK 64位服务器VM(build 24.0-b50, 混合模式) javac -version # 检测到JAVA_TOOL_OPTIONS: # 检测到_JAVA_OPTIONS:-Xmx512m -Xms64m # javac版本 1.7.0_40 export JAVA_TOOL_OPTIONS="-Xmx1 -Xms1" export _JAVA_OPTIONS="-Xmx512m -Xms64m" javac -version # 检测到JAVA_TOOL_OPTIONS:-Xmx1 -Xms1 # 检测到_JAVA_OPTIONS:-Xmx512m -Xms64m # javac版本 1.7.0_40 export JAVA_TOOL_OPTIONS="-Xmx512m -Xms64m" export _JAVA_OPTIONS="-Xmx1 -Xms1" javac -version # 检测到JAVA_TOOL_OPTIONS:-Xmx512m -Xms64m # 检测到_JAVA_OPTIONS:-Xmx1 -Xms1 # VM初始化时出错 # 初始堆太小 export JAVA_TOOL_OPTIONS="-Xmx1 -Xms1" export _JAVA_OPTIONS= java -Xmx512m -Xms64m -version # 检测到JAVA_TOOL_OPTIONS:-Xmx1 -Xms1 # 检测到_JAVA_OPTIONS: # java版本 "1.7.0_40" # OpenJDK运行时环境(IcedTea 2.4.1)(suse-3.41.1-x86_64) # OpenJDK 64位服务器VM(build 24.0-b50, 混合模式) export JAVA_TOOL_OPTIONS= export _JAVA_OPTIONS="-Xmx1 -Xms1" java -Xmx512m -Xms64m -version # 检测到JAVA_TOOL_OPTIONS: # 检测到_JAVA_OPTIONS:-Xmx1 -Xms1 # VM初始化时出错 # 初始堆太小
在Java中,有三个环境变量可以用于配置Java虚拟机(JVM)的选项,它们分别是_JAVA_OPTIONS、JAVA_TOOL_OPTIONS和JAVA_OPTS。但是,这三个选项之间存在一些区别和使用注意事项。
首先,JAVA_OPTS在JVM中没有特殊处理。这意味着,无论我们如何设置JAVA_OPTS环境变量,JVM都不会对其进行识别和处理。因此,我们不能依赖JAVA_OPTS来配置JVM选项。
而JAVA_TOOL_OPTIONS则是在标准的JVMTI规范中被包含的选项,它对带引号的空格有更好的处理方式,并且应该始终优先使用它,而不是未记录的Hotspot特定选项_JAVA_OPTIONS。这意味着,如果我们想要配置JVM选项,最好使用JAVA_TOOL_OPTIONS而不是_JAVA_OPTIONS。
另外需要注意的是,使用这些选项会在标准输出中打印额外的消息,无法通过任何手段来抑制这些消息的输出。
从JDK 9开始,出现了JDK_JAVA_OPTIONS环境变量,它被推荐作为_JAVA_OPTIONS的替代品。因此,在JDK 9及以上版本中,我们应该使用JDK_JAVA_OPTIONS来配置JVM选项,而不是_JAVA_OPTIONS。
我们在配置JVM选项时需要注意以上区别和使用注意事项,尽量使用JAVA_TOOL_OPTIONS或JDK_JAVA_OPTIONS来代替_JAVA_OPTIONS和JAVA_OPTS,以确保选项能够正确被JVM识别和处理。
在Java中,有三个环境变量可以用来设置JVM的选项:_JAVA_OPTIONS、JAVA_TOOL_OPTIONS和JAVA_OPTS。然而,这三个变量之间的差异并不清楚,因此我们需要对这个问题进行整理和解答。
首先,_JAVA_OPTIONS是一个不被官方文档所记录的变量,这意味着它并不被推荐使用。然而,一些人仍然滥用这个变量,将其设置在他们的.bashrc文件中。如果我们想要深入了解这个问题,可以查看Oracle HotSpot VM的源代码。
其次,JAVA_TOOL_OPTIONS是另一个可以用来设置JVM选项的变量。与_JAVA_OPTIONS不同的是,它是被官方记录的,并且有一些VM会支持它。
最后,JAVA_OPTS是一个常见的命名约定,用于设置JVM选项。它通常被用于启动脚本中,以传递额外的选项给JVM。
需要注意的是,这些选项在不同的情况下有不同的优先级。具体来说,_JAVA_OPTIONS优先于命令行参数,而命令行参数又优先于JAVA_TOOL_OPTIONS。
希望通过这篇文章能够帮助大家更好地理解_JAVA_OPTIONS、JAVA_TOOL_OPTIONS和JAVA_OPTS之间的区别,以及它们在设置JVM选项时的优先级关系。同时也提醒大家,由于_JAVA_OPTIONS并不被推荐使用且没有官方文档记录,因此在实际应用中应尽量避免使用该变量。