Java Profilers: Warum Sie diese 3 verschiedenen Typen brauchen

Das Debuggen von Leistungsproblemen in der Produktion kann mühsam und in einigen Fällen ohne die richtigen Tools unmöglich sein. Java-Profiling gibt es schon ewig, aber die meisten Entwickler denken nur an eine Art von Profiler: den Standard-JVM-Profiler.

Es reicht jedoch nicht aus, nur einen Typ von Profiler zu verwenden.

Angenommen, Sie analysieren die Leistung Ihrer Anwendung. Es gibt mehrere Profiling-Aktivitäten, die Sie durchführen können. Im Allgemeinen führen Standard-Profiler Speicher-, CPU- und Thread-Profiling durch.

Aber selbst bei dieser Abdeckung finden Sie mehr Leistungsprobleme, wenn Sie eine Kombination aus mehreren Profilern verwenden. Das liegt daran, dass jeder Profiler in einem bestimmten Aspekt besser ist, um einem Leistungsfehler auf die Spur zu kommen.

Java Profiler

In diesem Beitrag werden wir über die drei Arten von Java-Profilern sprechen und darüber, warum wir alle von ihnen bei der Entwicklung einer Anwendung benötigen. Wir beginnen mit den Typen und tauchen dann tief in jeden von ihnen ein.

Lassen Sie uns einen Blick auf die drei verschiedenen Arten von Java-Profilern werfen:

  1. Standard-JVM-Profiler, die jedes Detail der JVM verfolgen (CPU, Thread, Speicher, Garbage Collection usw.).
  2. Leichtgewichtige Profiler, die Ihre Anwendung mit ein wenig Abstraktion beleuchten.
  3. Tools für das Application Performance Management (APM), die für die Überwachung von Anwendungen in Produktionsumgebungen eingesetzt werden.
Neue Handlungsaufforderung

Standard-JVM-Profiler

Produkte wie VisualVM, JProfiler, YourKit und Java Mission Control.

Ein Standard-Java-Profiler liefert sicherlich die meisten Daten, aber nicht unbedingt die nützlichsten Informationen. Dies hängt von der Art der Debugging-Aufgabe ab.

JVM-Profiler verfolgen alle Methodenaufrufe und die Speichernutzung. Dies ermöglicht es einem Entwickler, in die Aufrufstruktur einzutauchen, egal aus welchem Blickwinkel er sie betrachtet.

Vorteile:

  • Großartig für das Aufspüren von Speicherlecks, zeigen Standard-Profiler detailliert die gesamte Speichernutzung durch die JVM und welche Klassen/Objekte dafür verantwortlich sind. Die Möglichkeit, die Garbage Collection manuell auszuführen und dann den Speicherverbrauch zu überprüfen, kann leicht ein Schlaglicht auf Klassen und Prozesse werfen, die fälschlicherweise Speicher beibehalten.
  • Gut für die Verfolgung der CPU-Nutzung, ein Java-Profiler bietet in der Regel eine CPU-Sampling-Funktion, um die CPU-Zeit nach Klassen und Methoden zu verfolgen und zu aggregieren, um Hot Spots aufzuspüren.

Nachteile:

  • Erfordert eine direkte Verbindung zur überwachten JVM; dies schränkt die Nutzung in den meisten Fällen auf Entwicklungsumgebungen ein. (Hinweis: Einige Profiler können in begrenztem Umfang mit Thread- und Speicherdumps arbeiten.)
  • Sie verlangsamen Ihre Anwendung; für den hohen Detaillierungsgrad ist eine Menge Rechenleistung erforderlich.

Leichtgewichtige Java Transaction Profiler

Produkte wie XRebel und Stackify Prefix.

Leichtgewichtige Profiler verfolgen einen anderen Ansatz bei der Verfolgung Ihrer Anwendung, indem sie sich selbst direkt in den Code einfügen.

  • Aspect Profiler verwenden aspektorientierte Programmierung (AOP), um Code in den Start und das Ende bestimmter Methoden einzufügen. Der eingefügte Code kann einen Timer starten und dann die verstrichene Zeit melden, wenn die Methode beendet ist. Diese Profiler sind einfach einzurichten, aber Sie müssen wissen, was Sie profilieren wollen. Ein Beispiel finden Sie unter Spring AOP Method Profiling.
  • Java Agent Profiler verwenden die Java Instrumentation API, um Code in Ihre Anwendung zu injizieren. Diese Methode hat einen besseren Zugriff auf Ihre Anwendung, da der Code auf der Bytecode-Ebene neu geschrieben wird. Auf diese Weise kann jeder Code, der in Ihrer Anwendung läuft, instrumentiert werden – sei es von Ihnen geschriebener Code oder Bibliotheken von Drittanbietern, von denen Ihre Anwendung abhängt. Lesen Sie diese Einführung in Java Agents, um zu sehen, wie das alles funktioniert.

Aspect Profiler sind ziemlich einfach einzurichten, aber sie können nur begrenzt überwachen und müssen alles, was überwacht werden soll, detailliert auflisten. Java-Agenten haben einen großen Vorteil in ihrer Überwachungstiefe, sind aber viel komplizierter zu schreiben.

Stackify Prefix ist ein entwicklerorientierter Java-Profiler, der die Java-Agent-Profiler-Methode hinter den Kulissen verwendet.

Das Tolle daran ist, dass Prefix bereits die am meisten gewünschten Klassen und Bibliotheken von Drittanbietern kennt, die die Entwickler instrumentieren wollen, so dass man sie nicht alle aufzählen muss. Außerdem werden alle Statistiken aus der Instrumentierung auf einfache und verständliche Weise angezeigt.

Beim Ausführen einer Anwendung mit Hibernate zeigt Prefix beispielsweise nicht nur die verstrichene Zeit für Abfragen an, sondern auch die Parameterwerte für das generierte SQL. Wenn Ihre Anwendung eine SOAP/REST-API aufruft, liefert Prefix den Inhalt der Anfrage und der Antwort.

Java Profiler Prefix Beispiel
Prefix Screenshot: Tomcat Web Request Trace

Low Overhead, Java JVM Profiling in Production (APM)

Alle bisherigen Profiler waren großartig für die Entwicklung, aber zu verfolgen, wie Ihr System in der Produktion funktioniert, ist entscheidend.

Produktion ist immer eine andere Landschaft – Entwicklungs- und Staging-Setups haben in der Regel nicht dieselben Datensätze und dieselbe Last.

Java APM-Tools verwenden in der Regel die Java Agent Profiler-Methode, aber mit anderen Instrumentierungsregeln, damit sie ohne Beeinträchtigung der Leistung in der Produktion laufen können. Der Trick bei diesen Profilern besteht darin, die richtigen Informationen auf intelligente Weise bereitzustellen, um keine CPU-Zyklen zu beanspruchen.

Stackify’s Retrace ist ein APM-Tool, das die gleiche Technik wie Stackify Prefix mit einigen Anpassungen verwendet, um in Staging- und Produktionsumgebungen reibungslos zu laufen.

Das geschieht durch die Aggregation von Timing-Statistiken und Sampling-Traces. Dadurch erhalten Sie auf Methodenebene Einblick in den Code Ihrer Anwendung, der in der Produktion läuft.

Wenn Sie also eine langsame Webanforderung haben, wird dies in einem Trace in Retrace angezeigt. Von dort aus können Sie sehen, welche Methoden der Übeltäter sind.

java profiler performance aggregation

Retrace Screenshot: Web Request Aggregation über 4 Stunden

java profiling tomcat trace
Retrace Screenshot: Tomcat Web Request Trace

Warum brauchen Sie alle 3 Profiler für Ihre Anwendung?

Standard-Profiler sind gut geeignet, um Leistungsprobleme in der Entwicklungsphase zu finden. Aber die Produktion ist ein anderes Szenario. Das Verhalten Ihrer Anwendung kann sich je nach eingehendem Datenverkehr, Serveranforderung, Antwort und vielen anderen Dingen ändern.

Was ist also die Lösung für die Produktionsumgebung? APM-Tools sind die Antwort. APM-Tools zielen auf die Produktionsumgebung ab und liefern einen Bericht über die Leistung Ihrer Anwendung.

Standard-Profiler helfen also bei der Entwicklung und APM-Tools helfen bei der Produktion. Sie fragen sich vielleicht, wozu Lightweight Transaction Profiler benötigt werden.

Nun, Lightweight Profiler verfolgen einen anderen Ansatz zur Code-Profilierung. Sie fügen sich direkt in den Code ein – vor allem am Anfang und am Ende einer Methode.

Sie sind außerdem einfach einzurichten und verbrauchen relativ wenig Ressourcen. Dies ist sehr nützlich für Anwendungen, die Hardware-Transaktionsspeicher verwenden. Diese Anwendungen erfordern raffinierte Analysewerkzeuge, die genau aufzeigen, welche Methode oder Funktion Leistungsprobleme verursacht.

Wenn Sie eine komplexe Anwendung entwickeln, werden Sie zweifellos alle drei Profiler benötigen. Jeder Profiler-Typ hat einen einzigartigen Ansatz, um eine Anwendung auf Leistungsprobleme zu überprüfen.

Die Umfrage von RebelLab hat auch gezeigt, dass die meisten Unternehmen mehrere Code-Profiler verwenden, um Leistungsprobleme in ihrer Anwendung zu finden.

Warum sind einige Java-Profiler so teuer?

XRebel ist ein cooles Tool, aber es kostet 365 Dollar pro Jahr. Stackify Prefix ist kostenlos und bietet einen Großteil der gleichen Funktionalität.

Das größte Problem bei APM-Lösungen ist definitiv ihr Preis. Sie waren traditionell so teuer, dass nur die größten Unternehmen sie sich leisten konnten.

Es macht nicht viel Sinn, etwa 100 Dollar pro Monat für einen Server bei Azure oder AWS auszugeben und dann fast 200 Dollar pro Monat für ein Produkt wie New Relic zu zahlen.

Überwachungstools sollten nicht mehr kosten als die Server!

Weiter lesen: APM Pricing Is Now Affordable for All Developers, and Why They Should Care

Wrapping It Up

Nachdem Sie nun die drei Arten von Java-Code-Profilern kennengelernt haben, ist es an der Zeit zu entscheiden, ob Sie wirklich alle benötigen.

Die Antwort liegt in der Natur Ihrer Anwendung.

Wenn es sich um eine kleine Anwendung handelt, wie z.B. das Kostenmanagementsystem eines lokalen Unternehmens oder eines Ladens, ist das Profiling sehr einfach. Ein Standard-Profiler reicht aus.

Wenn Sie eine Web-Anwendung wie das Tracking-System eines Kurierdienstes entwickeln, kann es sein, dass Tausende von Benutzern auf Ihre Anwendung zugreifen. In diesem Fall benötigen Sie auch APM-Tools für die Produktionsumgebung.

Wenn Ihre Anwendung für eingebettete Systeme bestimmt ist, benötigen Sie schließlich alle drei Tools.

Wählen Sie gut aus, und viel Spaß bei der Entwicklung einer Anwendung mit optimaler Leistung.

Start Free Trial

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.