Frage

Ich habe ein Kommandozeilen-Tool in Java bauen, die ich würde jetzt wie mit YourKit profilieren. Ich starte das Kommandozeilen-Tool mit so etwas wie:

$ java -classpath .:foo.bar.jar com.foobar.tools.TheTool arg1 arg2 arg3

Es wird vollständig ausgeführt in weniger als 2 Sekunden.

Nach dem Lesen http://www.yourkit.com/docs/80 /help/agent.jsp , habe ich versucht, die folgenden:

$ java -agentpath:/home/dspitzer/yjp-8.0.24/bin/linux-x86-32/libyjpagent.so -classpath .:foo.bar.jar com.foobar.tools.TheTool arg1 arg2 arg3

... und ich:

[YourKit Java Profiler 8.0.24] JVMTI version 3001016d; 14.3-b01; Sun Microsystems Inc.; mixed mode, sharing; Linux; 32-bit JVM
[YourKit Java Profiler 8.0.24] Profiler agent is listening on port 10001...
[YourKit Java Profiler 8.0.24] *** HINT ***: To get profiling results, connect to the application from the profiler UI
...

(Und dann das Werkzeug läuft bis zur Fertigstellung und wird beendet.)

I (standardmäßig mindestens) erraten YourKit nur anschließen konzipiert Anwendung ausgeführt wird.

Wie soll ich meine Kommandozeilen-Tool ändern Verbindung von YourKit zu erlauben?

  1. Ich könnte eine Befehlszeilenoption hinzufügen das wird es für die Eingabe Pause hat, und ich werde nicht drücken Rückkehr für sie weiter, bis ich mit ihm verbunden haben von YourKit.
  2. Sie haben einen YourKit API, dass ich konnte zu meinem Werkzeug hinzufügen, dass es würde dazu führen, zu blockieren, bis ich mit angeschlossen YourKit?
  3. Sie haben einen YourKit API oder ein java Befehlszeilenoption das würde eine Profilierung „Snapshot“ erstellen, dass ich laden und analysieren, könnte später (nach das Befehlszeilenprogramm abgeschlossen) mit YourKit?
War es hilfreich?

Lösung

Es gibt keine Möglichkeit profilierte Anwendung zu pausieren, bis Profiler "Connects"; Sie einfach brauchen nicht so zu tun.

Stattdessen gehen Sie wie folgt:

  • Einschalten gewünschten Profilierung Modi Start. Zum Beispiel, wenn Sie Notwendigkeit, Profil CPU-Auslastung, starten Sie entweder CPU Sampling oder CPU-Tracing mit entsprechenden Startoptionen „Abtasten“ oder „Tracing“. Siehe http://www.yourkit.com/docs/80/help/additional_agent_options. jsp

  • Wenn Profil Anwendung ist mit kurzer Laufzeit, ermöglicht Snapshot-Erfassung auf Ausfahrt mit „onexit = Snapshot“ Startoption. Später offen gefangen Snapshot in der Profiler-Benutzeroberfläche für die Analyse.

Andere Tipps

Ich bin mir nicht bewusst eine YourKit Option, dies zu tun (was nicht heißt, dass es nicht ein), aber es ist eine Java Remote-Debug-Option, dies zu tun.

Versuchen Sie, die folgenden auf der Befehlszeile hinzugefügt, zusätzlich zu den YourKit Mittel Optionen:

-Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=y

Dies sollte die VM verursacht so schnell auszusetzen, wie es startet, für einen Debugger wartet auf Port anschließen 8000. YourKit selbst keinen Debugger ist, sondern eine IDE wie Eclipse oder NetBean wird die Arbeit tun, ebenso wie die Grund jdb Kommandozeile.

So führen Sie den Befehl, wobei beide Optionen gesetzt, connect YourKit, dann einen Debugger verwenden, um den Debug-Port zu verbinden, die die VM löst die Ausführung fortzusetzen, so dass YourKit die Daten, die Sie benötigen.

Es wäre besser, das alles mit YourKit zu tun, aber ich kenne keine solche Art und Weise.

Sie können es über Eclipse-Start, die eine YourKit hat Plugin, das Einführungen auf app starten.

YourKit der onexit = Snapshot Option speichert eine Snapshot-Datei unter $ HOME / Snapshots auf JVM verlassen. Sie können für eine spätere Analyse dieser Momentaufnahme in den YourKit GUI laden. Siehe Diese Seite auf ihrer Website für weitere Details.

Die Antwort auf # 3 ist ja, gibt es eine API Sie Ihre Anwendung produzieren können haben, Ergebnisse Profilierungs dass YourKit kann dann untersuchen.

Werfen Sie einen Blick auf die API-Dokumentation , und auch die Kommandozeilen-Tool zur Steuerung Profilierungs

Hier ist ein Beispiel für die Verwendung der API (Ich habe diesen Code nicht versucht):

Controller ykController = new Controller();
ykController.enableStackTelemetry();
ykController.enableExceptionTelemetry();
ykController.startCPUProfiling(ProfilingModes.CPU_TRACING,Controller.DEFAULT_FILTERS);
ykController.startAllocationRecording(false,0,false,0);
YourMainClass.main(args);
String snapshotLocation = ykController.captureMemorySnapshot();
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top