为什么 JVM 参数以“-D”开头?

为什么我们需要在 JVM 参数前面加上 -D的前缀。

java -jar -DmyProp="Hello World" myProgram.jar

用于使用系统参数 myProp运行 myProgram.jar。那么,为什么是领先的 -D?为什么 Java 架构师不能让我们简单地这样做:

java -jar -myProp="Hello World" myProgram.jar

我希望得到的答案不仅仅是“因为事情就是这样”。

附加问题: 为什么字母 -D与其他字母相反,它代表什么?


注意: 这个问题询问 为什么首先是否需要使用“ D”,或者任何其他字母。它不太关心选择特定的字母“ D”而不是其他任何字母,虽然这是作为一个额外的问题。

额外的问题在这里有答案: 在 java-D 中,D 代表什么?

71636 次浏览

如果没有指定类似-myProp = “ XYZ”的内容,则表示它作为参数传递给程序的 main 方法。

-D means you can use this value using System.getProperty

- X 用于扩展参数,比如-Xdebug-Xnoagent-Djava 编译器 = NONE-Xrunjdwp: Transport = dt _ socket,server = y,susch = y,address = 8000

是的,他们可以互换。.但是这些字符用于指定传递的参数类型以及谁是使用者。

Without the -D the properties would conflict with normal JVM options. For example how would you set the property jar?

之所以选择 -D(我只能猜测这一点) ,是因为它也用于 C 预处理器中定义符号,因此大多数人都很熟悉。

为什么 Java 架构师不能让我们简单地这样做:

java -jar -myProp="Hello World" myProgram.jar

它现在可以工作,但是假设在下一个 Java 版本中引入了 -myProp参数作为 JVM 选项。
How to distinguish your -myProp from the -myProp JVM option ? No way.
因此,使用 -Ddefine系统性质进行分析存在着一个明显的原因。

作为另一个例子,假设您的程序依赖于 -client系统属性,而不是 -myProp
它不会运行:

java -jar -client="davidxxx" myProgram.jar

您可能会遇到一个 JVM 错误,比如:

Unrecognized option: -client=davidxxx

因为 -client是一个不需要值的 JVM 标准选项。

但是如果您使用 -D-client,那么现在就可以了,因为这里将 -Dclient定义为一个系统属性,它不同于 -client标准 JVM 选项:

java -jar -D-client="davidxxx" myProgram.jar

或者两者兼用:

java -jar -client -D-client="davidxxx" myProgram.jar

更进一步说,并非所有的 JVM 参数都以 -D开头。但是它们中的大多数都有一个前缀(-D-X-XX) ,以某种方式允许定义名称空间。

JVM 参数有不同的类别:

1. 标准期权(-D,但不仅仅是 -D)

这些是 JVM 的所有实现都支持的最常用的选项。

You use -D to specify System properties but most of them don't have any prefix :-verbose, -showversion, and so for...

2. 非标准期权(前缀为 -X)

这些选项是特定于 JavaHotSpot 虚拟机的通用选项。
例如: -Xmssize-Xmxsize

3. 高级运行时选项(前缀为 -XX)

这些选项控制 JavaHotSpot VM 的运行时行为。

高级 JIT 编译器选项(前缀为 -XX)

这些选项控制由 JavaHotSpot VM 执行的动态实时(JIT)编译。

5. Advanced Serviceability Options (prefixed with -XX)

这些选项提供了收集系统信息和执行大量调试的能力。

6. 高级垃圾收集选项(前缀为 -XX)

这些选项控制 JavaHotSpot VM 如何执行垃圾收集(GC)。


“定义”。其含义类似于 C 语言中的预处理器定义。D 表示定义在应用程序的上下文中,而不像可执行文件名之前的任何其他选项那样在 Java 解释器的上下文中。

字母“ D”的用法在 文件中没有特别解释,但是唯一的用法是在系统属性映射中“定义”一个键——除了这个引用:

System 类维护一个 Properties 对象,该对象定义当前工作环境的配置。有关这些属性的详细信息,请参阅系统属性。本节的其余部分解释如何使用属性管理应用程序配置。