Leistungseinbrüche reduzieren Performance bei Java-Anwendungen optimieren

Autor / Redakteur: Thomas Joos / Stephan Augsten

Gut entwickelte Java-Anwendungen bieten eine optimale Leistung, was im Internet auf einer Vielzahl von Webseiten oder Cloud-Apps zu sehen ist. Allerdings müssen Engpässe zuverlässig behoben werden.

Anbieter zum Thema

Die Zahl der Bremsen bei Java ist vielfältig, angefangen bei überflüssigen Schleifen bis hin zu ineffizienter Datenverarbeitung.
Die Zahl der Bremsen bei Java ist vielfältig, angefangen bei überflüssigen Schleifen bis hin zu ineffizienter Datenverarbeitung.
(Bild gemeinfrei: ACWG - Pixabay.com / Pixabay )

Engpässe und nicht optimaler Code führen bei Java schnell zu Leistungseinbrüchen. Aus diesem Grund ist es wichtig Java-Anwendungen regelmäßig zu überwachen, vor allem bezüglich der Leistung. Durch optimierten Code kann die Leistung von Java-Anwendungen deutlich gesteigert werden.

Viele Ansätze zur Leistungssteigerung in diesem Beitrag lassen sich natürlich auch auf andere Entwicklungsumgebungen übertragen. Durch das Verwenden der aktuellsten Compiler lassen sich häufig Leistungssteigerungen erzielen, die keinen Aufwand erfordern, da der Compiler selbst die Optimierung durchführen kann.

Optimierungen lassen sich am besten durch das Abarbeiten verschiedene Schritte erreichen:

  • 1. Benchmarks implementieren und durchführen
  • 2. Leistungsprobleme identifizieren
  • 3. Nur wenige Leistungsprobleme gleichzeitig beobachten auf Basis der zu erwartenden Leistungssteigerung
  • 4. Überprüfen woher das Problem kommt.
  • 5. Änderung am Code durchführen, um Leistung zu verbessern.
  • 6. Gesamtleistung messen
  • 7. Zurück zu Schritt 1

Ziel soll sein, nicht zu viele Änderungen auf einmal durchzuführen, sondern sehr strukturiert und gezielt vorzugehen, um Leistungsprobleme nach und nach zu beheben.

Einfache Optimierungen bringen häufig Verbesserung

Der Datentyp „int“ ist oft schneller als andere Datentypen wie „long“ oder „short“. Außerdem lassen sich über Variablen oft Leistungssteigerungen erzielen, da verschiedene Typen von Variablen (einfache, lokale, statische) auch Einfluss auf die Gesamtleistung haben. Schleifen sind oft Quelle von Leistungsproblemen, da zu viele Anweisungen in der Schleife enthalten sind, oder zu viele Methoden-Aufrufe durchgeführt werden.

Bessere Caching und optimale Datenbankanbindung

Enterprise-Anwendungen lassen sich durch Caching deutlich beschleunigen. Allerdings muss die Strategie dazu richtig gewählt werden. Viele Java-Anwendungen benötigen eine direkte Anbindung an Datenbanken. Auch hier sind eine richtige Strategie und die Erkenntnis wichtig, dass langsame Schnittstellen oder ineffizient verwendete Daten die ganze Anwendung ausbremsen können.

Für eine optimale Leistung sind die Profiler-Modi ebenso wichtig wie Benchmarks. Tools wie Eclipse Profiler, Netbeans Profiler und andere spielen eine wichtige Rolle für das Performance-Tuning. Dazu kommt Remote-Monitoring über JMX sowie JVMTI. Mit diesen Begriffen und Tools sollten sich Administratoren auseinandersetzen, wenn Sie Java-Apps optimieren wollen.

Java Virtual Machine (JVM) ist ein wichtiger Bestandteil der Java-Laufzeitumgebung (Java Runtime Environment, JRE). In Java-Programmen sind JVM für die Ausführung des Java-Codes zuständig. JVM kann auf Leistungsoptionen von CPUs zugreifen, wenn der Code richtig geschrieben ist.

Vor allem Funktionen wie Caching, Pipelines und Prefetch sollten effizient in den Code eingearbeitet werden. Allerdings ist eine einfache Optimierung des Java-Codes nicht ausreichend, um eine bessere Leistung zu erzielen.

Leistung in der Planungsphase berücksichtigen

Bereits frühzeitig in der Planung von Java-Anwendungen sollten auch Leistungsoptimierungen mit einbezogen werden. Hier spielen natürlich die Anforderungen der Anwendung eine wichtige Rolle. Wie bei anderen Entwicklungsumgebungen muss auch bei Java-Anwendungen das große Ganze im Auge behalten werden.

Entwickler müssen die Anforderungen umfassend verstehen und in den Code implementieren können. Nachträgliche Leistungssteigerungen sind schwer zu implementieren, wenn bereits grundlegende Funktionen in einer Anwendung nicht optimal umgesetzt wurden.

Vor allem im Bereich der Datenerfassung oder Datenübermittlung aus der Datenquelle lassen sich Optimierungen vornehmen. Dies gilt insbesondere, wenn unterschiedliche Daten verwendet werden, zum Beispiel Nummern und Texte. Um beispielsweise die Sucheffizienz zu erhöhen, sollte hier genau überprüft werden, wann welche Daten in die App eingelesen werden und wie das geschieht. Lineare Suchen oder Hashtabellen bieten für unterschiedliche Ansätze die Möglichkeit, eine Leistungssteigerung zu erzielen.

Zugriffszeiten auf Daten optimieren

Die Zugriffszeiten der Datenspeicher sollten in einer Java-Anwendung berücksichtigt werden. Das gilt vor allem dann, wenn die Daten von unterschiedlichen Datenträgern stammen, oder Systeme wie All-Flash-Arrays im Einsatz sind.

Wenn Daten aufeinander warten müssen, ist das schwächste Glied der Kette ausschlaggebend für die Leistung. Auch Zwischenspeicher mit sehr geringen Zugriffszeiten sollten hier berücksichtigt werden. Bei der Verarbeitung von Daten lassen sich besonders hohe Leistungssteigerungen erzielen, wenn das Abrufen von Daten umfänglich im Java-Code implementiert wird.

Vor allem in Java-Anwendungen hängen Speicherverbrauch und Leistung voneinander ab. Zeichenketten haben ebenfalls einen Einfluss auf die Leistung. Zur Optimierung von Java-Anwendungen sollten Entwickler daher auch den Zusammenhang von Daten und Java-Typen berücksichtigen. Stichworte in diesem Fall sind Garbage Collection und Hit-Rate, also Bereinigung des Speichers und Caching.

Objekte sind ein zentraler Bestandteil von Java. Werden neue Objekte erzeugt, lässt sich das mit Tools feststellen. Die Tools können dabei auch messe wo die meisten Objekte erstellt werden. An diesen Stellen sind häufig Leistungssteigerungen möglich.

Alle neuen Objekte bedingen auch das Erstellen von Metadaten, die gespeichert und verwaltet werden müssen. Daher kann das Reduzieren von Objekten einiges an Leistung einsparen und damit die Gesamtleistung des Systems verbessern. Teilweise ist es zum Beispiel möglich, wenige große Objekte anstelle vieler kleiner Objekte zu erstellen. Allerdings hängt das auch von der Art der Anwendung und der verwendeten Daten ab.

Nur verbessern, was notwendig ist

Soll eine Leistungssteigerung durch das Tunen von Code erfolgen, resultiert das meistens darin, dass der Code deutlich komplizierter wird. Solche Tuningmaßnahmen lassen sich häufig erst nach der Fertigstellung einer Anwendung durchführen, wenn mit Daten aus der Produktivumgebung gearbeitet wird. Hier sollten Entwickler allerdings nur die Bereiche tunen, die eine Leistungssteigerung erwarten lassen.

(ID:44700011)