【问题标题】:Reading Java system properties from command line从命令行读取 Java 系统属性
【发布时间】:2014-12-15 02:18:38
【问题描述】:

有没有更好的方法从命令行打印系统属性?因为我们可以设置属性,例如

 java  -D<name>=<value>  //set a system property

不写一个类来做到这一点?

如果不可能,为什么从命令行执行此操作是不可能/可行/好的?

【问题讨论】:

  • 启动 JVM 时设置了系统属性。在此之前没有什么可阅读的。
  • 您希望能够区分默认系统属性和那些通过命令行设置/覆盖的属性吗?
  • 你是在问如何读取系统属性?
  • 我需要知道某些目录设置是什么,例如当前设置的扩展目录是什么
  • 如果您还没有阅读过System PropertiesThe Extension Mechanism Architecture,您可能希望阅读,或者您可以直接跳进去尝试System.getProperty("java.ext.dirs")

标签: java environment-variables


【解决方案1】:

可以使用jdk自带的jps工具。 它可以打印出传递给 java 进程的系统属性。

例如:在我的系统上,eclipse 正在运行并且

$ jps -v

输出

6632  -Dosgi.requiredJavaVersion=1.6 -Xms1024m -Xmx2048m -XX:MaxPermSize=512m

jps位于JDK_HOME/bin

编辑

如果您想要所有属性,请使用同样位于JDK_HOME/bin 中的jinfo 工具。要使用它,您必须知道要从中获取信息的 java 进程的进程 ID。例如

$ jinfo 6632

此工具还会打印出java.ext.dirs

【讨论】:

  • 如何获取java.ext.dirs的值?
【解决方案2】:

您可以在 Hotspot JVM 1.7 及更高版本中使用-XshowSettings 标志(1.6 不支持):

java -XshowSettings:properties -version

OpenJDK 自 2010 年底以来一直支持此标志。

见于http://marxsoftware.blogspot.de/2016/02/hotspot-jvm-XshowSettings.html

2016 年 12 月 14 日编辑

Oracle JVM 附带工具 jcmd,它允许您查看正在运行的 JVM 中存在的标志。见:

https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr006.html

对于这个用例,您可以使用:

jcmd <pid> VM.system_properties

但还有许多其他有用的命令。例如:

jcmd <pid> VM.flags
jcmd <pid> VM.command_line
jcmd <pid> GC.run 

【讨论】:

  • 似乎VM.system_properties 只打印“众所周知”的属性。有没有办法查看用户创建的属性?
  • 我不知道。我建议您发布一个问题并将其链接到这个问题。
  • 如何在linux机器中获取系统属性
【解决方案3】:

如果您需要 JVM 最初设置的默认值,除非被覆盖,请使用:

java -XshowSettings:properties -version  

如果您没有正在运行的 Java 应用程序,这将很有帮助,因此没有 pid 可以传递给其他命令之一。

如果您正在寻找已通过默认设置或通过命令显式设置属性的 JVM 的属性,则使用通过 jps 找到的 JVM 的 pid 以及列出的 jcmdjinfo 命令在上面的答案中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-13
    • 2015-09-21
    • 1970-01-01
    • 1970-01-01
    • 2018-09-30
    • 2015-07-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多