Java-Leistungsoptimierung: Acht Anti-Patterns, die Ihren Code verlangsamen

✍️ OpenClawRadar📅 Veröffentlicht: 20. März 2026🔗 Source
Java-Leistungsoptimierung: Acht Anti-Patterns, die Ihren Code verlangsamen
Ad

Leistungsverbesserungen durch die Behebung von Anti-Patterns

Jonathan Vogel entwickelte eine Java-Bestellverarbeitungs-App, die anfangs eine Laufzeit von 1.198 ms hatte, 85.000 Bestellungen pro Sekunde verarbeitete, etwas mehr als 1 GB Heap verwendete und 19 GC-Pausen aufwies. Nach der Behebung von acht Anti-Patterns ohne Architekturänderungen oder JDK-Updates verbesserte sich die Leistung auf 239 ms Laufzeit, 419.000 Bestellungen pro Sekunde, 139 MB Heap und 4 GC-Pausen. Dies entspricht einer 5-fachen Durchsatzsteigerung, 87 % weniger Heap-Verbrauch und 79 % weniger GC-Pausen.

Acht Java-Leistungs-Anti-Patterns, die behoben werden sollten

  • String-Verkettung in Schleifen - O(n²) Kopiervorgänge aufgrund von Unveränderlichkeit
  • O(n²) Stream-Iteration innerhalb von Schleifen - Streamen der gesamten Liste pro Element
  • String.format() in Hot Paths - Langsamster String-Builder, parst Format bei jedem Aufruf
  • Autoboxing in Hot Paths - Millionen von Wegwerf-Wrapper-Objekten
  • Exceptions für Kontrollfluss - fillInStackTrace() durchläuft den gesamten Aufrufstack
  • Zu breite Synchronisierung - Eine Sperre wird zum Engpass
  • Wiederverwendbare Objekte neu erstellen - ObjectMapper, DateTimeFormatter, Gson pro Aufruf
  • Virtual Thread Pinning (JDK 21-23) - Synchronisiert + blockierende I/O blockiert Carrier
Ad

Detaillierte Beispiele und Lösungen

1. String-Verkettung in Schleifen

Problemcode:

String report = "";
for (String line : logLines) {
    report = report + line + "\n";
}

Dies erzeugt O(n²) Kopiervorgänge aufgrund der Unveränderlichkeit von Strings. BellSoft JMH Benchmarks zeigen, dass bei einer 4-fachen Vergrößerung von n die Schleifenverkettung um mehr als das 7-fache langsamer wird.

Lösung:

StringBuilder sb = new StringBuilder();
for (String line : logLines) {
    sb.append(line).append("\n");
}
String report = sb.toString();

Hinweis: Seit JDK 9 optimiert der Compiler Einzeilen-Verkettungen wie "Order: " + id + " total: " + amount, aber diese Optimierung gilt nicht für Schleifen.

2. Versehentliches O(n²) mit Streams in Schleifen

Problemcode:

for (Order order : orders) {
    int hour = order.timestamp().atZone(ZoneId.systemDefault()).getHour();
    long countForHour = orders.stream()
        .filter(o -> o.timestamp().atZone(ZoneId.systemDefault()).getHour() == hour)
        .count();
    ordersByHour.put(hour, countForHour);
}

Dieses Muster machte fast 71 % der CPU-Stack-Samples in der JFR-Aufzeichnung aus. Bei 10.000 Bestellungen führt es 100 Millionen Vergleiche anstelle eines einzigen Durchlaufs durch.

Lösung:

for (Order order : orders) {
    int hour = order.timestamp().atZone(ZoneId.systemDefault()).getHour();
    ordersByHour.merge(hour, 1L, Long::sum);
}

Dies bietet O(n)-Leistung mit einem Durchlauf. Man könnte auch Collectors.groupingBy(... Collectors.counting()) in einer einzigen Stream-Pipeline verwenden.

Der Artikel ist Teil 1 einer 3-teiligen Serie zur Java-Leistungsoptimierung, wobei die Teile 2 und 3 bald folgen. Teil 2 wird die Profiling-Daten hinter diesen Zahlen durchgehen, einschließlich Flame-Graphs und welche Methoden tatsächlich Hot waren.

📖 Read the full source: HN AI Agents

Ad

👀 Siehe auch

Aufbau eines vollständigen BI-Systems mit Claude Code und Metabase für unter 50 USD/Monat
Anleitungen

Aufbau eines vollständigen BI-Systems mit Claude Code und Metabase für unter 50 USD/Monat

Ein Reddit-Nutzer hat mit Claude Code, BigQuery und selbst gehostetem Metabase ein komplettes BI-System aufgebaut – und damit 15.000-$-Angebote von Experten durch 3 Tage Arbeit und 30 $ monatliche Cloud-Kosten ersetzt.

OpenClawRadar
Praktischer Rahmen für die Auswahl zwischen Claudes Haiku-, Sonnet- und Opus-Modellen
Anleitungen

Praktischer Rahmen für die Auswahl zwischen Claudes Haiku-, Sonnet- und Opus-Modellen

Ein Entwickler testete Claudes drei Modelle an einer 400-Zeilen-Express.js-Refactoring-Aufgabe und stellte fest, dass der entscheidende Unterschied die Tiefe der Argumentation ist, nicht die Intelligenz. Haiku 4.5 bewältigte einfache Teile, verpasste jedoch die Reihenfolge der Middleware, Sonnet 4.6 erkannte das Reihenfolgeproblem und fügte TypeScript-Typen hinzu, während Opus 4.6 eine Sicherheitslücke in der Auth-Middleware identifizierte.

OpenClawRadar
Umgang mit Gateway-Trennungen für effektive Automatisierung
Anleitungen

Umgang mit Gateway-Trennungen für effektive Automatisierung

Erforschen Sie praktische Lösungen zur Aufrechterhaltung des Betriebs von KI-Coding-Agenten bei Gateway-Trennungen. Zu den Tipps gehören die Überwachung mit Grafana, automatisierte Wiederverbindungs-Skripte und die Nutzung redundanter Pfade für mehr Zuverlässigkeit.

OpenClawRadar
Benutzerdefinierte Fähigkeiten für Claude Co-Work erstellen: Best Practices und Formate
Anleitungen

Benutzerdefinierte Fähigkeiten für Claude Co-Work erstellen: Best Practices und Formate

Erforsche bewährte Praktiken zur Erstellung benutzerdefinierter Fähigkeiten für Claude Co-Work mit spezifischen Formatierungstipps und Implementierungsratgebern aus nutzererfahrungen Einsichten.

OpenClawRadar