有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我需要检查是否显式设置了一些可以传递给JVM的选项,或者是否有其默认值

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

我已经检查了像java.lang.Systemjava.lang.Runtime这样的类,但是它们没有给我任何关于VM参数的有用信息

有没有办法得到我需要的信息


共 (5) 个答案

  1. # 1 楼答案

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

  2. # 2 楼答案

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

    import java.lang.management.ManagementFactory;
    import java.lang.management.RuntimeMXBean;
    ...
    RuntimeMXBean runtimeMxBean = ManagementFactory.getRuntimeMXBean();
    List<String> arguments = runtimeMxBean.getInputArguments();
    
  3. # 4 楼答案

    我发现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();
      }
    }
    

    如果希望参数位于List<String>中,则可以将其缩短

    最后一点注意:我们可能还想扩展它来处理命令行参数中包含空格的罕见情况

  4. # 5 楼答案

    启动时通过此-Dname=value

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

    value=System.getProperty("name");
    

    为了得到那个值