Wie können Sie in einer laufenden JVM die beim Start verwendeten jvm-Optionen programmgesteuert ermitteln?

8

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:

  • Welcher Garbage Collector wurde verwendet?
  • War / ist es aktiv cpu Profiling?
  • War / ist das Protokollieren von GC-Aktivitäten?
  • War / ist es in -Xint oder -Xmixed mode?
  • Wurde / is -XX:ParallelGCThreads gesetzt - wenn ja, auf was, und wenn nicht, was ist der Standard für diesen Build?
  • War / is -XX:UseCompressedOops ein- oder ausgeschaltet?
  • usw.

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.

    
Mickalot 07.06.2013, 23:58
quelle

3 Antworten

2

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.

    
Ales 08.06.2013, 00:21
quelle
5

Sie können Befehlszeilenargumente durch

erhalten %Vor%     
ZhongYu 08.06.2013 00:07
quelle
2

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.

%Vor%

Mit 7u71 erhalte ich 663 Optionen oder mit -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions , 779.

    
Trevor Robinson 24.03.2015 02:23
quelle

Tags und Links