为啥 JVM 参数以“-D”开头?
Posted
技术标签:
【中文标题】为啥 JVM 参数以“-D”开头?【英文标题】:Why do JVM arguments start with "-D"?为什么 JVM 参数以“-D”开头? 【发布时间】:2017-11-28 10:33:59 【问题描述】:为什么我们需要在 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”而不是任何其他字母,尽管这是一个额外的问题。
奖金问题在这里有答案:In java -D what does the D stand for?。
【问题讨论】:
这对 Oracle/Sun 开发人员来说是个好问题。顺便说一句,为什么这对你来说是个问题? @BackSlash 我想了解他们“为什么”,而不仅仅是“让事情发挥作用”。 所有很好的答案;不幸的是,我只能接受一个。谢谢各位大神指教! In java -D what does the D stand for?的可能重复 @Autar 这不是重复的。虽然它回答了“奖励问题”,但它没有回答主要问题。 【参考方案1】:如果您没有指定类似 -myProp="XYZ" 的任何内容,则表示它作为参数传递给程序的 main 方法。
-D 表示您可以使用 System.getProperty 使用此值
-X 用于扩展参数,例如 -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
是的,他们可以互换..字符;但是这些字符是用来指定传递什么类型的参数以及谁是消费者。
【讨论】:
谢谢,“X”前缀也在我的脑海中。你知道除了“D”和“X”之外,是否还有其他字母用于为特殊类型的参数添加前缀?另外,在上面,我看到您在“X”前缀的示例下有“Djava.compiler”。这是正确的吗?【参考方案2】:如果没有-D
,这些属性将与正常的 JVM 选项发生冲突。例如,您将如何设置属性jar
?
-D
可能被选中(我只能推测),因为它也在 C 预处理器中用于定义符号,因此为大多数人所熟悉。
【讨论】:
【参考方案3】:为什么 Java 的架构师不能让我们简单地做:
java -jar -myProp="Hello World" myProgram.jar
它现在可以工作,但假设在下一个 Java 版本中,-myProp
参数被引入作为 JVM 选项。
如何区分 -myProp
和 -myProp
JVM 选项?没办法。
因此,使用-D
来定义 系统属性存在一个明显的理由。
作为其他示例,假设您的程序依赖于 -client
系统属性,而不是 -myProp
。
它不会运行:
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) 的方式。
【讨论】:
【参考方案4】:“定义”。含义类似于 C 中的预处理器定义。-D 表示定义在应用程序的上下文中,而不是在 Java 解释器上下文中,就像可执行文件名称之前的任何其他选项一样。
the documentation 中没有具体解释字母“D”的用法,但唯一的用途是在系统属性映射中“定义”一个键 - 除了这个参考:
System 类维护一个 Properties 对象,该对象定义了当前工作环境的配置。有关这些属性的更多信息,请参阅系统属性。本节的其余部分说明如何使用属性来管理应用程序配置。
【讨论】:
你有相关文档吗? 将近两年后,我意识到,尽管这个答案非常出色,但它回答了额外的问题,而不是解释一般前缀的需要,所以我改用另一个答案作为接受的答案。以上是关于为啥 JVM 参数以“-D”开头?的主要内容,如果未能解决你的问题,请参考以下文章