首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何从Java应用程序内部获取VM参数?

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

Stack Overflow用户
提问于 2009-09-29 06:22:57
回答 5查看 183K关注 0票数 176

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

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

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

有没有办法弄到我需要的信息?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-10-07 14:32:15

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

代码语言:javascript
复制
import java.lang.management.ManagementFactory;
import java.lang.management.RuntimeMXBean;
...
RuntimeMXBean runtimeMxBean = ManagementFactory.getRuntimeMXBean();
List<String> arguments = runtimeMxBean.getInputArguments();
票数 204
EN

Stack Overflow用户

发布于 2010-11-22 23:34:26

在启动时传递此-Dname=value

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

代码语言:javascript
复制
value=System.getProperty("name");

来获得这个值

票数 223
EN

Stack Overflow用户

发布于 2017-11-29 20:44:41

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

下面是SSCCE:

代码语言:javascript
复制
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>中使用参数,可以将其缩短。

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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1490869

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档