2016-09-04 3 views
7

Ich habe eine Anwendung in Java geschrieben und ich möchte wissen, wie viel Zeit es dauert, bis static void int main(String args) erreichen und was es in diesem Stadium macht, wie kann ich das erreichen?Wie kann ich die JVM-Startzeit messen?

Ich bin mir bewusst, dass Microsoft ein Tool namens MPGO (Manager Profil Guided Optimization) gibt es ein Äquivalent für Java?

Antwort

5

Ein einfacher Weg, Start-up-Zeit von innen Java-Anwendung zu messen:

import java.lang.management.ManagementFactory; 

public class Test { 

    public static void main(String[] args) { 
     long currentTime = System.currentTimeMillis(); 
     long vmStartTime = ManagementFactory.getRuntimeMXBean().getStartTime(); 
     System.out.println(currentTime - vmStartTime); 
    } 
} 

Sie verwenden können JVMTI agent für Tracing VM Ereignisse wie das Laden von Klassen, Garbage Collection, Methode Kompilation usw. Hier ist ein einfaches Mittel I habe gemacht - (und die compiled dll für Windows).

[0.00000] VMTrace started 
[0.00182] Dynamic code generated: flush_icache_stub 
[0.00187] Dynamic code generated: get_cpu_info_stub 
[0.00519] Dynamic code generated: getCPUIDNameInfo_stub 
[0.00524] Dynamic code generated: forward exception 
[0.00526] Dynamic code generated: call_stub 
... 
[0.01182] Loading class: java/lang/Object 
[0.01198] Loading class: java/lang/String 
[0.01206] Loading class: java/io/Serializable 
... 
[0.05620] VM initialized 
[0.05664] Class prepared: java/lang/invoke/MethodHandle 
[0.05672] Loading class: java/lang/invoke/MethodHandleImpl 
[0.05732] Class prepared: java/lang/invoke/MethodHandleImpl 
[0.05738] Loading class: java/lang/invoke/MethodHandleImpl$1 
[0.05743] Class prepared: java/lang/invoke/MethodHandleImpl$1 
[0.05755] Loading class: java/lang/invoke/MethodHandleImpl$2 
[0.05759] Loading class: java/util/function/Function 
[0.05768] Class prepared: java/util/function/Function 
... 
+0

vereinheitlichten, versuchen Sie dies und lassen Sie wissen, das Ergebnis – Har

+0

Ich habe es ausprobiert und es scheint mir einige nette Werte geben, aber manchmal die Beschreibung fehlt oder ist fehlerhaft, dh ich bekomme Dinge wie [0.02056] Dber und [0.031ber. Eine seltsame Sache ist, dass ich zwei VM-Startnachrichten bekomme. Auch sind nicht alle Zeitstempel sequentiell, weil Threading? Schließlich gibt es noch keinen letzten Datensatz mit dem Namen [VMTrace beendet], mit dem ich den Zeitabstand zwischen den letzten beiden Datensätzen berechnen könnte. – Har

+1

@Har Ja, in der Multithread-Umgebung kann die Ausgabe aufgrund von Problemen mit der Parallelität gemischt erscheinen. Ein Mutex, der die Funktion ['trace'] (https://github.com/apangin/vmtrace/blob/master/src/vmtrace.c#L25) umgibt, sollte das Problem lösen. Es kann auch besser sein, die Agentenausgabe von der Anwendungsausgabe zu trennen - Sie können den Dateinamen als Agentenargument angeben. – apangin

1

Wenn Sie JRockit JVM verwenden, können Sie das folgende Flag hinzufügen Zeiten des Jvm zu verstehen ab und startete

-Xverbose:codegen 

Weitere Einzelheiten sind hier https://docs.oracle.com/cd/E13150_01/jrockit_jvm/jrockit/geninfo/diagnos/slow_start.html#wp1083972

aktualisieren 5/9/2016

Weiter zu unseren Gesprächen unten. jstat liefert zeitbasierte Statistiken über den Classloader. Eine virtuelle Maschine id (vmid) muß durch Ausführen

jps 

mit dieser ID dem folgenden erhalten werden kann, jede Sekunde für 10 Sekunden

jstat -class {vmid} 1000 10 

Dies wird eine Momentaufnahme des Classloader ausgeführt werden.

+0

diese Optionen in der Version frei java 8 se vorhanden sind:

Run java -agentpath:path\to\vmtrace.dll Main und die Ereignis-Trace wird stderr gedruckt werden? – Har

+1

Die besten Funktionen wurden in Hotspot zusammengeführt. Sehen Sie unter der Debugging-Überschrift auf der folgenden Seite nach, um diese Informationen für Java 8 se zu erhalten. http://www.oracle.com/technetwork/articles/java/vmoptions-jsp-140102.html –

+1

Schauen Sie sich ciTime oder vielleicht traceClassLoading –

4

Mit java 9 können Sie -Xlog:class+init=info:file=trace.log zur Trace-Klasseninitialisierung hinzufügen (was der nächste Schritt nach dem Laden der Klasse ist) und dann nach Ihrer Hauptklasse filtern. Es ist eine neue logging feature.

Sie können auch angeben, dass alles protokolliert werden soll, um zu sehen, was vor dem Start passiert, aber die Menge der protokollierten Ereignisse würde wahrscheinlich die Ergebnisse verzerren.

In Java 8 und niedrigere verschiedene VM-Komponenten haben ihre eigene Protokollierung (oft nur über printf) und Klassen laden ist eine, die keine Zeitstempel enthält.

+0

Wie gibst du an um Zeitstempel zu aktivieren? Ich kann die Option dafür nicht finden, ich habe -XX: + TraceClassResolution -XX: + TraceClassLoading -XX: + UnlockDiagnosticVMOptions -XX: LogFile = C: \ Benutzer \ Har \ out.txt -XX: + PrintCompilation – Har

+1

sorry, ich falsch gemerkt, in 8 erhalten Sie nur Zeitstempel für printcompilation und gc logs (keine davon ist nützlich, um die Startzeit zu bestimmen), nicht für Classloading. Ich nehme an, diese Inkonsistenzen sind einer der Gründe, warum sie die Anmeldung 9 – the8472

Verwandte Themen