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

时间:2017-06-25 10:05:31

标签: java command-line

为什么我们需要使用-D作为JVM参数的前缀,例如从命令行运行jar时? E.g。

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

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

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

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

奖金问题:为什么字母-D与任何其他字母相对,是否代表什么?

注意:此问题首先要求为什么需要使用“D”或任何其他字母。它不像任何其他字母那样关注特定字母“D”的选择,尽管这被称为奖金问题。

红利问题在这里有一个答案:In java -D what does the D stand for?

4 个答案:

答案 0 :(得分:30)

  

为什么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

因为-client是一个JVM标准选项,它不期望任何值。

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

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

或者同时使用两者:

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

To go further, not all JVM arguments start with -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)。

答案 1 :(得分:29)

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

字母的使用&#34; D&#34;在the documentation中没有具体说明,但唯一的用途是&#34;定义&#34;系统属性映射中的一个键 - 除了此引用:

  

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

答案 2 :(得分:6)

如果你没有指定像-myProp =“XYZ”这样的东西,那就意味着它作为参数传递给程序的main方法。

-D表示您可以使用System.getProperty

来使用此值

-X用于扩展参数,如-Xdebug -Xnoagent -Djava.compiler = NONE -Xrunjdwp:transport = dt_socket,server = y,suspend = y,address = 8000

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

答案 3 :(得分:2)

如果没有-D,属性将与普通的JVM选项冲突。例如,您如何设置属性jar

可能选择-D(我只能推测),因为它也在C预处理器中用于定义符号,因此大多数人都很熟悉。