Hintergrund: Ich teste einige Leistungstests für eine Java-Anwendung, die über mehrere indirekte Ebenen gestartet wird, so dass ich nicht ganz sicher bin, ob die Anwendung mit den Flags gestartet wird, von denen ich glaube, dass sie es sind. Ich möchte, dass meine Anwendung eine Plausibilitätsprüfung enthält (bevor sie mit dem Leistungstest beginnt) und in die Ergebnisse (nach dem Test) Informationen über die Abstimmung der JVM einfügt, beispielsweise:
-Xint
oder -Xmixed
mode? -XX:ParallelGCThreads
gesetzt - wenn ja, auf was, und wenn nicht, was ist der Standard für diesen Build? -XX:UseCompressedOops
ein- oder ausgeschaltet? Gibt es eine Möglichkeit für Java-Code (innerhalb einer laufenden JVM), die tatsächlichen Optionen abzufragen, die für die enthaltene JVM verwendet werden? (Angenommen, ich kann die Befehlszeile, die mich gestartet hat, nicht sehen, daher kann ich diese Flags nicht erneut analysieren.)
Wenn es keinen allgemeingültigen Weg gibt, dies zu ermitteln, sind auch Antworten, die für eine bestimmte JVM-Implementierung spezifisch sind, willkommen.
UPDATE:
Es ist wichtig, dass die Lösung wissen kann, welche Standardwerte für einen Wert gelten, der nicht explizit in der Befehlszeile angegeben wird. Andernfalls wird es eine Menge (fehleranfälliger) Beinarbeit erfordern, um nachzuschlagen, was der Standardwert für eine gegebene Kombination JVM / Plattform / Version / Architektur ist. Ich teste über eine Vielzahl von JVMs hinweg, so dass ich nicht manuell herausfinden muss, was die Standardeinstellung für jeden Parameter in jeder jvm-Version ist.
Sie könnten einen JMX-Client (wie VisualVM) verwenden und dann getVMOption(String name)
aufrufen, siehe HotSpotDiagnosticMXBean .
Oder wenn Sie mindestens einen Satz Flags übergeben können, um die JVM-Protokollierung zu aktivieren, sollte es --XX:+LogVMOutput -XX:LogFile=jvm.log
lauten und dann die Ausgabe des Protokolls von Ihrer App analysieren. Das Protokoll enthält alle Flags / Parameter, die zum Starten der JVM verwendet werden.
Eine weitere Option ist den JVM-Prozess aufzulisten , der von PID mit ps -ef
gestartet wurde, und dort können Sie alle Eingabeargumente dieses Prozesses sehen. Das sollte für jeden JVM-Typ funktionieren.
Der folgende Java 7-Code listet alle von -XX:+PrintFlagsFinal
zurückgegebenen JVM-Optionen auf. Es versucht, Reflektion zu verwenden, um auf das paketgeschützte Flag
Hilfsklasse (verfügbar seit Java 6) und fällt zurück auf HotSpotDiagnosticMXBean.getDiagnosticOptions()
wenn das nicht funktioniert.
Mit 7u71 erhalte ich 663 Optionen oder mit -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions
, 779.
Tags und Links java jvm jvm-arguments