Profiling von kurzlebigen Java-Anwendungen

7

Gibt es einen Java-Profiler, mit dem kurzlebige Anwendungen erstellt werden können? Die Profiler, die ich bisher gefunden habe, scheinen mit Anwendungen zu arbeiten, die bis zur Beendigung des Benutzers laufen. Ich möchte jedoch Anwendungen profilieren, die wie Befehlszeilendienstprogramme funktionieren. Es wird sofort ausgeführt und beendet. Tools wie VisualVM oder NetBeans Profiler erkennen nicht einmal, dass die Anwendung ausgeführt wurde.

Ich suche etwas Ähnliches wie Pythons cProfile, da das Profiler-Ergebnis zurückgegeben wird, wenn die Anwendung beendet wird.

    
ejel 16.04.2010, 20:54
quelle

10 Antworten

8

Sie können Ihre Anwendung mit dem JVM-HPROF-Profil profilieren.

Es bietet zwei Methoden:

  1. Sampling die aktiven Methoden auf dem Stack
  2. Timing Methode Ausführungszeiten mit injizierten Bytecode (BCI, Byte Codee Injektion)

Abtastung

Diese Methode zeigt, wie oft Methoden oben auf dem Stapel gefunden wurden.

%Vor%

Timing

Diese Methode zählt die tatsächlichen Aufrufe einer Methode. Der Instrumentierungscode wurde zuvor von der JVM eingegeben.

%Vor%

Hinweis: Diese Methode verlangsamt die Ausführungszeit drastisch.

Bei beiden Methoden lautet der Standarddateiname java.hprof.txt , wenn die Option file= nicht vorhanden ist.

Vollständige Hilfe erhalten Sie mit java -agentlib:hprof=help oder finden Sie auf Orakel-Dokumentation

    
VHF 16.04.2010, 21:06
quelle
5

Sun Java 6 hat das java -Xprof , das ' Ich gebe Ihnen einige Profiling-Daten.

%Vor%     
McDowell 17.04.2010 11:31
quelle
4

Ein Programm mit 30 Sekunden ist nicht kurzlebig. Was Sie wollen, ist ein Profiler, der Ihr Programm starten kann, anstatt Sie an ein laufendes System anzuhängen. Ich glaube, dass die meisten Profiler das können, aber Sie würden höchstwahrscheinlich eines in einer IDE am besten mögen. Schau dir Netbeans an.

    
quelle
4

Das Profilieren von kurz laufenden Java-Anwendungen hat einige technische Schwierigkeiten:

  • Profiling-Tools arbeiten normalerweise, indem sie regelmäßig das SP- oder PC-Register des Prozessors abtasten, um zu sehen, wo die Anwendung gerade ausgeführt wird. Wenn Ihre Anwendung kurzlebig ist, können nicht genügend Proben entnommen werden, um ein genaues Bild zu erhalten.

Sie können dies beheben, indem Sie die Anwendung so ändern, dass sie in einer Schleife mehrmals ausgeführt wird, wie von @Mike vorgeschlagen. Sie werden Probleme haben, wenn Ihre App System.exit() aufruft, aber das Hauptproblem ist ...

  • Die Leistungsmerkmale einer kurzlebigen Java-Anwendung werden wahrscheinlich durch JVM-Aufwärmeffekte verzerrt. Es wird viel Zeit darauf verwendet, die von Ihrer App benötigten Klassen zu laden. Dann wird Ihr Code (und der Bibliothekscode) ein wenig interpretiert, bis der JIT-Compiler herausgefunden hat, was zu nativem Code kompiliert werden muss. Schließlich wird der JIT-Compiler Zeit mit seiner Arbeit verbringen.

Ich weiß nicht, ob Profiler versuchen, JVM-Aufwärmeffekte zu kompensieren. Aber selbst wenn sie dies tun, beeinflussen diese Effekte das tatsächliche Verhalten Ihrer Anwendungen, und es gibt nicht viel, was der Anwendungsentwickler tun kann, um sie zu mindern.

Zurück zu meinem vorherigen Punkt ... Wenn Sie eine kurzlebige App in einer Schleife ausführen, tun Sie etwas, das sein normales Ausführungsmuster ändert und die JVM-Aufwärmkomponente entfernt. Wenn Sie also die Methode optimieren, die etwa 50% der Ausführungszeit in der modifizierten App einnimmt, ist das wirklich 50% der Zeit ohne JVM-Warmup . Wenn JVM Warmup etwa 80% der Ausführungszeit verwendet, wenn die App normal ausgeführt wird, optimieren Sie tatsächlich 50% von 20% ... und das ist den Aufwand nicht wert.

    
Stephen C 17.04.2010 00:46
quelle
2

Wenn es nicht lange genug dauert, wickle einfach eine Schleife um es herum, eine Endlosschleife, wenn du magst. Dies hat keine Auswirkungen auf die in Prozent oder in Codezeilen verwendeten inklusiven Zeitprozentsätze. Dann, da es viel Zeit braucht, Ich verlasse mich nur auf diese Technik . Das sagt aus, welche Codezeilen, ob Funktionsaufrufe oder nicht, den höchsten Prozentsatz an Zeit kosten und daher am meisten gewinnen würden, wenn sie vermieden werden könnten.

    
Mike Dunlavey 16.04.2010 21:08
quelle
2

Starten Sie Ihre Anwendung mit aktivierter Profilerstellung und warten Sie, bis der Profiler angehängt ist. Jeder Profiler, der der Java-Profiling-Architektur entspricht, sollte funktionieren. Ich habe das mit NetBeans Profiler versucht.

im Grunde, wenn Ihre Anwendung startet, wartet es auf einen Profiler vor der Ausführung angefügt werden. So kann technisch sogar eine Zeile der Codeausführung profiliert werden.

Mit diesem Ansatz können Sie alle Arten von Dingen aus Threads, Speicher, CPU, Methode / Klasse Aufrufzeiten / Dauer profilieren ...

Ссылка

    
kctang 17.04.2010 11:48
quelle
1

Der SD Java Profiler kann Anweisungsblock-Ausführungszählungsdaten erfassen, unabhängig davon, wie kurz Ihr Lauf ist . Die relativen Ausführungszahlen sagen Ihnen, wo die Zeit verbracht wurde.

    
Ira Baxter 17.04.2010 06:05
quelle
1

Sie können eine Messung (Messung) verwenden: Ссылка Sie können auch die resultierenden Schnappschüsse einsehen: Ссылка

Disclaimer: Ich bin der Architekt von JXInsight / OpenCore.

    
William Louth 04.03.2012 10:18
quelle
0

Ich schlage vor, dass Sie yourkit versuchen. Es kann von Anfang an ein Profil erstellen und die Ergebnisse nach Abschluss des Programms ausgeben. Sie müssen dafür bezahlen, aber Sie können eine Evaluierungslizenz erhalten oder die EAP-Version ohne eine verwenden. (Zeitlich begrenzt)

    
Peter Lawrey 16.04.2010 22:53
quelle
0

YourKit kann eine Momentaufnahme einer Profilsitzung erstellen, die später in der YourKit GUI analysiert werden kann. Ich nutze dies, um eine kurzlebige Befehlszeilenanwendung zu profilieren, an der ich arbeite. Siehe meine Antwort zu diese Frage für Details.

    
Binil Thomas 16.04.2010 23:05
quelle