it-swarm.com.de

Java-Anwendungsprofilerstellung

Ich bin auf der Suche nach einem Java-Code-Profiler, mit dem ich meine Anwendung in der Produktion profilieren kann (dies ist ein Dienst, der im Backend ausgeführt wird) (bedeutet also wenig Aufwand und darf meine Anwendung nicht verlangsamen). In erster Linie möchte ich Tree-Profiling aufrufen, dh wenn a() Aufrufe b() und dann b() Aufrufe c (), dann wie viel Zeit a() b() und c() nahmen sowohl inklusiv als auch ausschließlich.

Ich habe jvisualvm und jprofiler gesehen, aber das ist nicht das, wonach ich suche, weil ich meine Produktionsanwendung nicht an sie binden kann, da dies zu einem großen Leistungsproblem führen wird.

Außerdem habe ich metrics durchlaufen ( https://github.com/dropwizard/metrics ), aber ich bekomme keine Funktionalität, um den aufrufenden Baum zu profilieren.

Ich brauche die Bibliothek Callgrind ( http://valgrind.org/docs/manual/cl-manual.html ), da ich Baumstrukturierungsfunktionen und erweiterte Optionen wie das Vermeiden von Aufrufzyklen (Rekursion) zur Verfügung stellt. Ich bin mir jedoch nicht sicher, ob Callgrind in der Produktion verwendet werden kann, da es bei Programmende Daten ausgibt.

Kann jemand einen guten Caller-Tree-Profiler für Java vorschlagen, der in der Produktion verwendet werden kann, ohne die Leistung zu beeinträchtigen?

14
Arry

Werfen Sie einen Blick auf Java Mission Control in Verbindung mit Flight Recorder . Mit der Veröffentlichung von Oracle JDK 7 Update 40 (7u40) wird Java Mission Control mit der HotSpot-JVM gebündelt. Sie ist hochintegriert und hat den Eindruck, geringe Auswirkungen auf die Laufzeitleistung zu haben. Ich habe gerade erst angefangen, mir das anzuschauen, und sehe einige Call Tree-Funktionen.

enter image description here

12
kc2001

Im Allgemeinen verwenden Sie keine Profiler (oder empfehle ich nicht), um Ihre Anwendung zu instrumentieren. Instrumentierung bedeutet immer einen unkontrollierbaren Produktionsaufwand.

Was Sie verwenden können, ist ein Sampling-Profiler. Ein Sampling-Profiler erstellt eine Momentaufnahme der Stack-Spuren in einem kontrollierbaren Intervall. Was Sie nicht bekommen, ist die Anzahl der Anrufe, aber nach einiger Zeit erhalten Sie einen guten Überblick, wo Sie Hotspots haben. Da Sie das Abtastintervall des Profilers anpassen können, können Sie dessen Overhead beeinflussen.

Mit dem JDK wird ein verwendbarer Sampling-Profiler ausgeliefert, siehe Seite hprof in der Dokumentation zu Java 7 . Früher gab es grafische Analysewerkzeuge für die hprof-CPU-Spuren (nicht die Heap-Spuren). Jetzt sind sie weg. Sie können jedoch bereits mit der generierten Textdatei arbeiten.

Ich habe mir die oben erwähnten Java Mission Control-Artikel kurz angesehen. Ich denke, dass es ziemlich mächtig ist, eine Menge Bedürfnisse zu befriedigen, in dem Whitepaper heißt es, dass es nur 2% Overhead hat. Es ist jedoch nicht ganz das, was ich persönlich brauche oder will. Für meine Anwendungen ist es besser, immer ein "leichtes" Profiling zu haben.

9
cruftex

Der Intel Amplifier XE http://software.intel.com/de-de/intel-vtune-amplifier-xe hat einen geringen Overhead, wenn er auffällig ist. Es verwendet Stack-Sampling-Technologie, um die Auswirkungen zu minimieren, und es kann an laufende Prozesse in der Produktion angeschlossen und getrennt werden. Sie benötigen sogar keine Quellen während der Profilerstellung. Sie können später nach dem Durchsuchen von Offline-Leistungsergebnissen in Quellen eintauchen.

4
Andrew

Ich kenne kein Tool, mit dem sich Profiling ohne Auswirkungen auf die Leistung durchführen lässt.

Sie können den Methoden, die Sie interessieren, die Protokollierung hinzufügen. Stellen Sie sicher, dass Sie den Zeitstempel in das Protokoll aufnehmen. dann kannst du das Timing machen. Sie sollten das Protokollierungsframework auch so konfigurieren, dass es asynchron protokolliert, um den Leistungsverlust zu reduzieren.

Ein Ladezeit-Weaver wie AspectJ kann diese Aufrufe zur Laufzeit hinzufügen, wodurch Sie die zu überwachenden Methoden leicht auswählen können, ohne den Quellcode ständig zu ändern.

Mit einem around-Aspekt können Sie sogar eine Timing-Protokollierung hinzufügen, sodass Sie die Protokolle nicht parsen und nach übereinstimmenden Protokolleinträgen suchen müssen. Siehe diesen Blogeintrag für Details .

Werfen Sie einen Blick auf perfspy ( tutorial ). Vielleicht erledigen Sie bereits das, was Sie brauchen.

Verbunden:

1
Aaron Digulla