簡體   English   中英

如何從Java應用程序內部獲取VM參數?

[英]How to get VM arguments from inside of Java application?

我需要檢查是否可以傳遞給JVM的某個選項是顯式設置還是具有默認值。

更具體一點:我需要創建一個具有比默認堆棧大更高的本機堆棧大小的特定線程,但是如果用戶希望通過指定-Xss選項來自己處理這些事情,我想創建所有默認線程堆棧大小(將由用戶在-Xss選項中指定)。

我檢查過像java.lang.Systemjava.lang.Runtime這樣的類,但這些都沒有給我任何有關VM參數的有用信息。

有沒有辦法獲得我需要的信息?

在啟動時傳遞此-Dname=value

然后在你的代碼中你應該使用

value=System.getProperty("name");

獲得這個價值

使用此代碼,您可以獲取JVM參數:

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

我發現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>的參數,可以縮短。

最后注意:我們可能還想擴展它以處理在命令行參數中有空格的罕見情況。

我沒有嘗試專門獲取VM設置,但JMX實用程序中有大量信息,特別是MXBean實用程序。 這將是我開始的地方。 希望你找到一些可以幫助你的東西。

太陽網站上有很多技術:

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

如果你想要java進程的整個命令行,你可以使用: JvmArguments.java (使用JNA + / proc的組合來覆蓋大多數unix實現)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM