Profilierung von Java-Code: Engpässe für Anfänger finden

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Profilierung von Java-Code: Engpässe für Anfänger finden

\n\n

Jeder Java-Entwickler stößt früher oder später auf Leistungsprobleme: Die Anwendung läuft langsam, verbraucht zu viel Speicher oder hängt sich auf. Anstatt zu raten, welcher Codeabschnitt das Problem verursacht, verwenden erfahrene Programmierer Profiling – den Prozess der Leistungsanalyse einer Anwendung. In diesem Artikel erklären wir, was Profilierung von Java-Code ist, welche Tools es gibt und wie Sie damit Engpässe finden.

\n\n

Was ist Profilierung und warum wird sie benötigt?

\n\n

Profiling ist das Sammeln von Daten über das Verhalten einer Anwendung in Echtzeit: Ausführungszeit von Methoden, Speichernutzung, Anzahl der Aufrufe, Threads und CPU-Auslastung. Ohne Profiling wird die Optimierung zum Raten: Sie ändern Code, ohne zu wissen, wo das eigentliche Problem liegt. Profiling gibt Antworten auf Fragen:

\n\n
    \n
  • Welche Methoden werden am längsten ausgeführt?
  • \n
  • Wie viele Objekte werden im Heap erstellt?
  • \n
  • Gibt es Speicherlecks?
  • \n
  • Welche Threads werden blockiert?
  • \n
\n\n

Für einen Anfänger-Entwickler ist Profiling eine Superkraft, die es ermöglicht, keine Stunden mit sinnlosem Refactoring zu verschwenden, sondern gezielt echte Engpässe zu beheben.

\n\n

Wichtige Profiling-Tools für Java

\n\n

Es gibt viele Tools, aber wir konzentrieren uns auf die drei beliebtesten und für Anfänger zugänglichsten.

\n\n

1. VisualVM (kostenlos)

\n\n

VisualVM ist ein integriertes JDK-Tool (vor Version 9 musste es separat heruntergeladen werden, jetzt wird es mit OpenJDK als separates Paket geliefert). Es ermöglicht die Überwachung von CPU, Speicher, Threads und die Erstellung von Heap-Dumps. So starten Sie:

\n\n
    \n
  • Starten Sie Ihre Java-Anwendung.
  • \n
  • Öffnen Sie VisualVM (Befehl jvisualvm im Terminal).
  • \n
  • Wählen Sie im linken Bereich den Prozess Ihrer Anwendung aus.
  • \n
  • Gehen Sie zum Tab "Sampler" für CPU-Profiling oder "Heap Dump" für die Speicheranalyse.
  • \n
\n\n

Beispiel: Wenn Ihre Anwendung hängt, öffnen Sie den Tab "Threads" und sehen Sie, welche Threads sich im Zustand BLOCKED oder WAITING befinden.

\n\n

2. JProfiler (kostenpflichtig, aber mit Testversion)

\n\n

JProfiler bietet eine tiefere Analyse: Sie können nicht nur die Ausführungszeit von Methoden sehen, sondern auch SQL-Abfragen, HTTP-Anfragen und Objektallokationen detailliert analysieren. Für Anfänger mag es komplex erscheinen, aber seine interaktiven Grafiken sind sehr anschaulich.

\n\n

3. In JDK integrierte Tools (jcmd, jstat, jstack)

\n\n

Auch ohne Installation zusätzlicher Programme können Sie Befehlszeilen-Tools verwenden:

\n\n
    \n
  • jstat -gc <pid> – zeigt Garbage-Collection-Statistiken.
  • \n
  • jstack <pid> – gibt einen Thread-Dump aus (hilft, Deadlocks zu finden).
  • \n
  • jcmd <pid> GC.heap_dump /path/to/dump.hprof – erstellt einen Heap-Dump.
  • \n
\n\n

Diese Tools sind die Grundlage für eine schnelle Diagnose ohne grafische Oberfläche.

\n\n

Wie man einen Engpass findet: Schritt-für-Schritt-Beispiel

\n\n

Angenommen, wir haben ein einfaches Programm, das eine Liste von Zahlen verarbeitet und etwas Langsames tut:

\n\n
import java.util.ArrayList;\nimport java.util.List;\nimport java.util.Random;\n\npublic class SlowApp {\n    public static void main(String[] args) {\n        List<Integer> numbers = generateNumbers(100000);\n        long sum = processNumbers(numbers);\n        System.out.println("Sum: " + sum);\n    }\n\n    private static List<Integer> generateNumbers(int count) {\n        List<Integer> list = new ArrayList<>();\n        Random rand = new Random();\n        for (int i = 0; i < count; i++) {\n            list.add(rand.nextInt(1000));\n        }\n        return list;\n    }\n\n    private static long processNumbers(List<Integer> numbers) {\n        long sum = 0;\n        for (int i = 0; i < numbers.size(); i++) {                

Blogs

Buchempfehlungen