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
...
vereinheitlichten, versuchen Sie dies und lassen Sie wissen, das Ergebnis – Har
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
@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