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

Col*_*dal 53 java command-line

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

java -jar -DmyProp="Hello World" myProgram.jar
Run Code Online (Sandbox Code Playgroud)

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

java -jar -myProp="Hello World" myProgram.jar
Run Code Online (Sandbox Code Playgroud)

我希望得到的答案不仅仅是"因为它就是这样".

奖金问题:为什么这封信-D与任何其他信件相对,是否代表什么?


注意:这个问题询问为什么首先需要使用"D"或任何其他字母.它不像任何其他字母那样关注特定字母"D"的选择,尽管这被称为奖励问题.

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

dav*_*xxx 48

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

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

它可以在今天工作,但假设在下一个Java版本-myProp中引入了一个参数作为JVM选项.
如何区分您-myProp-myPropJVM选项?没门.
因此,存在-D用于定义系统属性的明显原因.

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

java -jar -client="davidxxx" myProgram.jar
Run Code Online (Sandbox Code Playgroud)

您将遇到JVM错误,例如:

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

-client是一个没有价值的JVM标准选项.

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

java -jar -D-client="davidxxx" myProgram.jar
Run Code Online (Sandbox Code Playgroud)

或者通过使用两者:

java -jar -client -D-client="davidxxx" myProgram.jar
Run Code Online (Sandbox Code Playgroud)

更进一步,并非所有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)的方式.



Rak*_*rai 31

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

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

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


Dee*_*pak 7

如果没有指定-myProp ="XYZ"之类的东西,则意味着它作为参数传递给程序的main方法.

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

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

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


Hen*_*nry 5

如果没有,-D属性将与正常的 JVM 选项发生冲突。例如,您将如何设置该属性jar

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