wake-up-neo.net

Wie erhält man vm-Argumente aus der Java-Anwendung?

Ich muss überprüfen, ob eine Option, die an JVM übergeben werden kann, explizit festgelegt ist oder über einen Standardwert verfügt. 

Um genauer zu sein:
Ich muss einen bestimmten Thread mit einer höheren nativen Stackgröße als den Standard-Thread erstellen. Falls der Benutzer sich jedoch durch die Angabe der Option -Xss selbst um solche Dinge kümmern möchte, möchte ich alle Threads mit der Standardstapelgröße erstellen (welche wird vom Benutzer in der Option -Xss angegeben). 

Ich habe Klassen wie Java.lang.System und Java.lang.Runtime geprüft, aber diese geben mir keine Informationen über vmargs

Gibt es eine Möglichkeit, die benötigten Informationen zu erhalten?

141
okutane

Mit diesem Code können Sie die JVM-Argumente abrufen:

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

Beim Start übergeben Sie diesen -Dname=value

und dann in Ihrem Code sollten Sie verwenden

value=System.getProperty("name");

um diesen Wert zu erhalten

173
Java_Freak

Ich habe festgestellt, dass HotSpot alle Argumente VM in der Management-Bean auflistet, mit Ausnahme von -client und -server. Wenn Sie also das Argument -client/-server aus dem Namen VM ableiten und dies zur Liste der Laufzeit-Management-Bean hinzufügen, erhalten Sie die vollständige Liste der Argumente.

Hier ist der 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();
  }
}

Könnte verkürzt werden, wenn Sie die Argumente in einem List<String> haben möchten.

Schlussbemerkung: Vielleicht möchten wir dies auch erweitern, um den seltenen Fall zu behandeln, in dem Befehlszeilenargumente Leerzeichen enthalten.

3
Stefan Reich

Ich habe nicht versucht, die Einstellungen für VM gezielt zu erhalten, aber es gibt eine Fülle von Informationen in den JMX-Dienstprogrammen, insbesondere den MXBean-Dienstprogrammen. Hier würde ich anfangen. Hoffentlich findest du dort etwas, um dir zu helfen.

Die Sun-Website bietet eine Reihe von Technologien:

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

2
reccles

Wenn Sie die gesamte Befehlszeile Ihres Java-Prozesses benötigen, können Sie Folgendes verwenden: JvmArguments.Java (Verwendet eine Kombination aus JNA +/proc, um die meisten Unix-Implementierungen abzudecken)

0
user2179737