176

我需要检查某些可以传递给 JVM 的选项是否已显式设置或具有其默认值。

更具体地说:我需要创建一个具有比默认堆栈大小更高的本机堆栈大小的特定线程,但如果用户想通过指定-Xss选项自己处理这些事情,我想创建所有具有默认堆栈大小的线程(将由用户在 -Xss 选项中指定)。

java.lang.System我已经检查了and之类的类java.lang.Runtime,但是这些并没有给我任何有关 VM 参数的有用信息。

有什么方法可以获得我需要的信息吗?

4

5 回答 5

226

在启动时通过这个-Dname=value

然后在你的代码中你应该使用

value=System.getProperty("name");

得到那个值

于 2010-11-22T15:34:25.643 回答
204

使用此代码,您可以获得 JVM 参数:

import java.lang.management.ManagementFactory;
import java.lang.management.RuntimeMXBean;
...
RuntimeMXBean runtimeMxBean = ManagementFactory.getRuntimeMXBean();
List<String> arguments = runtimeMxBean.getInputArguments();
于 2009-10-07T14:32:15.057 回答
6

我发现 HotSpot 列出了管理 bean 中除了 -client 和 -server 之外的所有 VM 参数。因此,如果您从 VM 名称推断 -client/-server 参数并将其添加到运行时管理 bean 的列表中,您将获得完整的参数列表。

这是SSCCE:

import java.util.*;
import java.lang.management.ManagementFactory;

class main {
  public static void main(final String[] args) {
    System.out.println(fullVMArguments());
  }

  static String fullVMArguments() {
    String name = javaVmName();
    return (contains(name, "Server") ? "-server "
      : contains(name, "Client") ? "-client " : "")
      + joinWithSpace(vmArguments());
  }

  static List<String> vmArguments() {
    return ManagementFactory.getRuntimeMXBean().getInputArguments();
  }

  static boolean contains(String s, String b) {
    return s != null && s.indexOf(b) >= 0;
  }

  static String javaVmName() {
    return System.getProperty("java.vm.name");
  }

  static String joinWithSpace(Collection<String> c) {
    return join(" ", c);
  }

  public static String join(String glue, Iterable<String> strings) {
    if (strings == null) return "";
    StringBuilder buf = new StringBuilder();
    Iterator<String> i = strings.iterator();
    if (i.hasNext()) {
      buf.append(i.next());
      while (i.hasNext())
        buf.append(glue).append(i.next());
    }
    return buf.toString();
  }
}

如果您想要 a 中的参数,可以缩短List<String>

最后说明:我们可能还想扩展它以处理命令行参数中包含空格的罕见情况。

于 2017-11-29T12:44:40.827 回答
3

我没有尝试专门获取 VM 设置,但 JMX 实用程序中提供了大量信息,特别是 MXBean 实用程序。这将是我开始的地方。希望你在那里找到可以帮助你的东西。

sun 网站上有很多关于该技术的信息:

http://java.sun.com/javase/6/docs/technotes/guides/management/mxbeans.html

于 2009-10-02T03:02:41.027 回答
2

如果你想要你的 java 进程的整个命令行,你可以使用:JvmArguments.java (使用 JNA + /proc 的组合来覆盖大多数 unix 实现)

于 2017-09-20T14:02:13.513 回答