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

2022-08-31 09:10:59

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

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

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

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

我希望得到一个超越“因为事情就是这样”的答案。

奖金问题:为什么这封信而不是任何其他信件,它代表什么吗?-D


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

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


答案 1

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

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

它今天可以工作,但假设在下一个Java版本中,一个参数作为JVM选项引入。
如何区分您的JVM选项?不可能。
因此,它存在一个明显的理由来定义系统属性。-myProp-myProp-myProp-D

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

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

您将遇到 JVM 错误,例如:

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

就像一个不期望任何值的JVM标准选项一样。-client

但是,如果您使用 ,它现在很好,因为这里被定义为与标准 JVM 选项不同的系统属性:-D-client-Dclient-client

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 热点虚拟机的通用选项。
例如:-Xmssize-Xmxsize

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

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

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

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

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

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

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

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



答案 2

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

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

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


推荐