jvm常用参数 如何从Java应用程序内部获取vm参数?




jvm常用参数 (4)

在启动时传递这个-Dname=value

然后在你的代码中使用

value=System.getProperty("name");

以获得该价值

我需要检查是否可以传递给JVM的某些选项被明确设置或者具有默认值。

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

我已经检查过像java.lang.Systemjava.lang.Runtime这样的类,但是这些并没有给我关于vmargs信息。

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


Answer #1

我发现HotSpot列出了除-client和-server之外的管理bean中的所有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();
  }
}

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

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


Answer #2

通过这段代码,你可以得到JVM参数:

import java.lang.management.ManagementFactory;
import java.lang.management.RuntimeMXBean;
...
RuntimeMXBean runtimeMxBean = ManagementFactory.getRuntimeMXBean();
List<String> arguments = runtimeMxBean.getInputArguments();

Answer #3

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





jvm-arguments