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

新手上路,请多包涵

为什么我们需要在 JVM 参数前加上 -D 例如,当从命令行运行 jar 时?例如

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

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

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

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

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


注意: 这个问题问的 是为什么 首先需要使用“D”或任何其他字母。它不太关心特定字母“D”的选择而不是任何其他字母,尽管这是作为奖励问题提出的。

奖金问题在这里有一个答案: 在 java -D 中,D 代表什么? .

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

阅读 899
2 个回答

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

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

它今天可以工作,但假设在下一个 Java 版本中,一个 -myProp 参数作为 JVM 选项被引入。

如何区分 -myProp-myProp JVM 选项?没门。

因此,使用 -D定义 系统属性是一个明显的理由。

作为其他示例,而不是 -myProp 假设您的程序依赖于 -client 系统属性。

它不会运行:

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

您会遇到 JVM 错误,例如:

无法识别的选项:-client=davidxxx

as -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 但不仅如此)。

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

您使用 -D 指定系统属性,但其中大多数没有任何前缀: -verbose-showversion ,等等

2. 非标准选项(前缀为 -X

这些选项是特定于 Java HotSpot 虚拟机的通用选项。

例如: -Xmssize-Xmxsize

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

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

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

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

5. 高级可维护性选项(前缀为 -XX

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

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

这些选项控制 Java HotSpot VM 执行垃圾收集 (GC) 的方式。


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

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

字母“D”的用法在 文档 中没有具体解释,但唯一的用途是在系统属性映射中“定义”一个键——除了这个参考:

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

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

推荐问题