为了账号安全,请及时绑定邮箱和手机立即绑定

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

/ 猿问

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

qq_笑_17 2019-07-30 14:17:04

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

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

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

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

有没有办法获得我需要的信息?


查看完整描述

3 回答

?
慕码人2483693

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


import java.lang.management.ManagementFactory;

import java.lang.management.RuntimeMXBean;

...

RuntimeMXBean runtimeMxBean = ManagementFactory.getRuntimeMXBean();

List<String> arguments = runtimeMxBean.getInputArguments();


查看完整回答
反对 回复 2019-07-30
?
jeck猫

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

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

value=System.getProperty("name");

获得这个价值


查看完整回答
反对 回复 2019-07-30
?
至尊宝的传说

我发现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>

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


查看完整回答
反对 回复 2019-07-30

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信