【问题标题】: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 我想了解他们“为什么”,而不仅仅是“让事情发挥作用”。
  • 所有很好的答案;不幸的是,我只能接受一个。谢谢各位大神指教!
  • @Autar 这不是重复的。虽然它回答了“奖励问题”,但它没有回答主要问题。

标签: java command-line


【解决方案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 对象,该对象定义了当前工作环境的配置。有关这些属性的更多信息,请参阅系统属性。本节的其余部分说明如何使用属性来管理应用程序配置。

      【讨论】:

      • 你有相关文档吗?
      • 将近两年后,我意识到,尽管这个答案非常出色,但它回答了额外的问题,而不是解释一般前缀的需要,所以我改用另一个答案作为接受的答案。
      猜你喜欢
      • 2014-05-17
      • 2015-06-15
      • 1970-01-01
      • 2015-01-03
      • 2013-07-12
      • 2011-01-29
      • 2011-09-06
      • 2013-12-19
      • 1970-01-01
      相关资源
      最近更新 更多