web-dev-qa-db-ja.com

VMアプリケーションの内部からJava引数を取得する方法は?

JVMに渡すことができるオプションが明示的に設定されているか、デフォルト値が設定されているかどうかを確認する必要があります。

具体的には、デフォルトよりもネイティブスタックサイズが大きい特定のスレッドを1つ作成する必要がありますが、ユーザーが-Xssオプションを指定してそのようなことを自分で処理したい場合は、すべて作成しますデフォルトのスタックサイズのスレッド(ユーザーが-Xssオプションで指定します)。

Java.lang.SystemJava.lang.Runtimeなどのクラスをチェックしましたが、これらはVM引数に関する有用な情報を提供していません。

必要な情報を取得する方法はありますか?

147
okutane

このコードを使用すると、JVM引数を取得できます。

import Java.lang.management.ManagementFactory;
import Java.lang.management.RuntimeMXBean;
...
RuntimeMXBean runtimeMxBean = ManagementFactory.getRuntimeMXBean();
List<String> arguments = runtimeMxBean.getInputArguments();
166
David Schuler

起動時にこの-Dname=valueを渡します

そして、あなたのコードで使用する必要があります

value=System.getProperty("name");

その価値を得るために

182
Java_Freak

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>の引数が必要な場合は、短くすることができます。

最後の注意:コマンドライン引数にスペースが含まれるまれなケースを処理するために、これを拡張することもできます。

3
Stefan Reich

VM設定の取得は特に試みていませんが、JMXユーティリティ、特にMXBeanユーティリティには豊富な情報があります。ここから始めます。うまくいけば、あなたがあなたを助ける何かを見つけます。

SunのWebサイトには、テクノロジーに関する次のような情報があります。

http://Java.Sun.com/javase/6/docs/technotes/guides/management/mxbeans.html

2
reccles

Javaプロセスのコマンドライン全体が必要な場合は、以下を使用できます。 JvmArguments.Java (JNA +/procの組み合わせを使用して、ほとんどのUNIX実装をカバー)

0
user2179737