为什么JVM参数以“-D”开头?
为什么我们需要使用-D
为JVM参数添加前缀,例如从命令行运行jar时? 例如
java -jar -DmyProp="Hello World" myProgram.jar
用于使用系统参数myProp
运行myProp
。 那么为什么领先-D
? 为什么Java的架构师不能让我们这样做:
java -jar -myProp="Hello World" myProgram.jar
我希望得到的答案不仅仅是“因为它就是这样”。
奖金问题:为什么字母-D
与任何其他字母相反,它代表什么?
“限定”。 其含义类似于C中的预处理程序定义。-D表示定义位于应用程序的上下文中,而不是像可执行文件名之前的任何其他选项一样位于Java解释器上下文中。
字母“D”的用法没有在文档中具体说明,但唯一的用途是在系统属性映射中“定义”一个键 – 除了这个引用:
System类维护一个Properties对象,该对象定义当前工作环境的配置。 有关这些属性的更多信息,请参阅系统属性。 本节的其余部分介绍了如何使用属性来管理应用程序配置。
为什么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
为前缀)
这些选项提供了收集系统信息和执行大量调试的function。
6.高级垃圾收集选项(以-XX
为前缀)
这些选项控制Java HotSpot VM如何执行垃圾收集(GC)。
如果没有指定-myProp =“XYZ”之类的东西,则意味着它作为参数传递给程序的main方法。
-D表示您可以使用System.getProperty来使用此值
-X用于扩展参数,如-Xdebug -Xnoagent -Djava.compiler = NONE -Xrunjdwp:transport = dt_socket,server = y,suspend = y,address = 8000
是的,他们可以互换……人物; 但是这些字符用于指定传递的参数类型以及谁是使用者。
如果没有-D
,属性将与正常的JVM选项冲突。 例如,你如何设置属性jar
?
可能选择-D
(我只能推测),因为它也用于C预处理器来定义符号,因此对大多数人来说都很熟悉。