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?
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();
Beim Start übergeben Sie diesen -Dname=value
und dann in Ihrem Code sollten Sie verwenden
value=System.getProperty("name");
um diesen Wert zu erhalten
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.
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
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)