Vorwort
Diese Arbeit wurde mithilfe von KI übersetzt. Wir freuen uns über dein Feedback und deine Kommentare: translation-feedback@oreilly.com
Als O'Reilly zum ersten Mal an mich herantrat, um ein Buch über Java-Leistungstuning zu schreiben, war ich unsicher. Java-Leistung, dachte ich - sind wir damit nicht fertig? Ja, ich arbeite immer noch täglich daran, die Leistung von Java- (und anderen) Anwendungen zu verbessern, aber ich denke, dass ich die meiste Zeit damit verbringe, mich mit algorithmischen Ineffizienzen und externen Systemengpässen zu befassen und nicht mit Dingen, die direkt mit Java-Tuning zu tun haben.
Ein kurzer Moment des Nachdenkens hat mich davon überzeugt, dass ich mir (wie immer) etwas vorgemacht habe. Es ist sicherlich wahr, dass die End-to-End-Systemleistung einen Großteil meiner Zeit in Anspruch nimmt und dass ich manchmal auf Code stoße, der eine Algorithmus zu verwenden, wenn er einen mit O(logN) Leistung verwenden könnte. Trotzdem denke ich jeden Tag über die Leistung der Speicherbereinigung (GC) nach, über die Leistung des JVM-Compilers oder darüber, wie ich die beste Leistung aus den Java-APIs herausholen kann.
Das soll die enormen Fortschritte nicht schmälern, die in den letzten mehr als 20 Jahren bei der Leistung von Java und JVMs gemacht wurden. Als ich in den späten 1990er Jahren Java-Evangelist bei Sun war, gab es als einzigen echten "Benchmark" den CaffeineMark 2.0 von Pendragon Software. Aus verschiedenen Gründen schränkte das Design dieses Benchmarks seinen Wert schnell ein. Trotzdem erzählten wir damals gerne, dass die Leistung von Java 1.1.8 achtmal schneller war als die Leistung von Java 1.0 auf der Grundlage dieses Benchmarks. Und das stimmte auch - Java 1.1.8 hatte einen echten Just-in-Time-Compiler, während Java 1.0 so gut wie vollständig interpretiert war.
Dann begannen Standardisierungsausschüsse, strengere Benchmarks zu entwickeln, und die Java-Leistung wurde auf diese Benchmarks ausgerichtet. Das Ergebnis war eine kontinuierliche Verbesserung in allen Bereichen der JVM - Speicherbereinigung, Kompilierung und innerhalb der APIs. Dieser Prozess geht natürlich auch heute noch weiter, aber eine der interessanten Tatsachen bei der Arbeit an der Leistung ist, dass sie immer schwieriger wird. Die Verachtfachung der Leistung durch die Einführung eines Just-in-Time-Compilers war eine einfache technische Angelegenheit, und auch wenn der Compiler immer besser wird, werden wir eine solche Verbesserung nicht noch einmal erleben. Die Parallelisierung des Garbage Collectors war eine enorme Leistungsverbesserung, aber die jüngsten Änderungen erfolgten eher schrittweise.
Das ist ein typischer Prozess für Anwendungen (und die JVM selbst ist nur eine weitere Anwendung): Zu Beginn eines Projekts ist es einfach, Änderungen an der Architektur (oder Codefehler) zu finden, die zu enormen Leistungsverbesserungen führen, wenn sie behoben werden. In einer ausgereiften Anwendung sind solche Leistungsverbesserungen eher selten zu finden.
Diese Annahme war der Grund für meine ursprüngliche Sorge, dass die Welt der Ingenieure mit der Java-Leistung weitgehend fertig sein könnte. Ein paar Dinge haben mich davon überzeugt, dass ich falsch lag. Erstens sehe ich täglich viele Fragen dazu, wie sich dieser oder jener Aspekt der JVM unter bestimmten Umständen verhält. Ständig kommen neue Ingenieure zu Java, und das Verhalten der JVM ist in bestimmten Bereichen immer noch so komplex, dass ein Leitfaden zu ihrer Funktionsweise immer noch von Vorteil ist. Zweitens haben die Veränderungen in der Computerwelt die Leistungsanforderungen, mit denen Ingenieure heute konfrontiert sind, offenbar verändert.
In den letzten Jahren hat sich das Thema Leistung in zwei Richtungen entwickelt. Auf der einen Seite sind sehr große Maschinen, auf denen JVMs mit sehr großen Heaps laufen können, inzwischen alltäglich. Die JVM begegnet diesen Bedenken mit einem neuen Garbage Collector (G1), der als neue Technologie etwas mehr Handarbeit erfordert als herkömmliche Collectors. Gleichzeitig hat das Cloud Computing die Bedeutung von kleinen Single-CPU-Maschinen wieder erhöht: Du kannst bei Oracle, Amazon oder einer Reihe anderer Unternehmen günstig eine Single-CPU-Maschine mieten, um einen kleinen Anwendungsserver zu betreiben. (Du bekommst nicht wirklich eine Single-CPU-Maschine: Du bekommst ein virtuelles Betriebssystem-Image auf einer sehr großen Maschine, aber das virtuelle Betriebssystem ist auf die Nutzung einer einzigen CPU beschränkt. Aus der Perspektive von Java ist das dasselbe wie eine Single-CPU-Maschine.) In solchen Umgebungen ist die korrekte Verwaltung kleiner Mengen an Speicher sehr wichtig.
Auch die Java-Plattform entwickelt sich ständig weiter. Jede neue Ausgabe von Java bietet neue Sprachfunktionen und neue APIs, die die Produktivität von Entwicklern verbessern - wenn auch nicht immer die Leistung ihrer Anwendungen. Bewährte Methoden bei der Nutzung dieser Sprachfunktionen können dazu beitragen, dass eine Anwendung besser läuft als eine, die nur vor sich hin dümpelt. Und die Entwicklung der Plattform wirft interessante Fragen zur Leistung auf: Es steht außer Frage, dass die Verwendung von JSON zum Austausch von Informationen zwischen zwei Programmen viel einfacher ist als die Entwicklung eines hoch optimierten proprietären Protokolls. Die Zeitersparnis für Entwickler ist ein großer Gewinn - aber das eigentliche Ziel ist es, sicherzustellen, dass dieser Produktivitätsgewinn mit einem Leistungsgewinn einhergeht (oder sich zumindest ausgleicht).
Wer sollte (und wer sollte nicht) dieses Buch lesen?
Dieses Buch richtet sich an Performance-Ingenieure und Entwickler, die verstehen wollen, wie sich verschiedene Aspekte der JVM und der Java-APIs auf die Leistung auswirken.
Wenn es Sonntagabend ist, deine Website am Montagmorgen online geht und du nach einer schnellen Lösung für Leistungsprobleme suchst, ist dies nicht das richtige Buch für dich.
Wenn du neu in der Leistungsanalyse bist und mit dieser Analyse in Java beginnst, kann dir dieses Buch helfen. Mein Ziel ist es, so viele Informationen und Zusammenhänge zu vermitteln, dass auch Neulinge verstehen, wie sie grundlegende Tuning- und Leistungsprinzipien auf eine Java-Anwendung anwenden können. Die Systemanalyse ist jedoch ein weites Feld. Es gibt eine Reihe hervorragender Ressourcen für die Systemanalyse im Allgemeinen (und diese Prinzipien gelten natürlich auch für Java), und in diesem Sinne wird dieses Buch idealerweise eine nützliche Ergänzung zu diesen Texten sein.
Um Java wirklich schnell zu machen, muss man jedoch genau verstehen, wie die JVM (und die Java-APIs) tatsächlich funktionieren. Es gibt Hunderte von Java-Tuning-Flags, und beim Tuning der JVM muss man mehr tun, als sie blindlings auszuprobieren und zu sehen, was funktioniert. Mein Ziel ist es stattdessen, detailliertes Wissen darüber zu vermitteln, was die JVM und die APIs tun, in der Hoffnung, dass du, wenn du verstehst, wie diese Dinge funktionieren, in der Lage sein wirst, das spezifische Verhalten einer Anwendung zu untersuchen und zu verstehen , warum sie schlecht funktioniert. Wenn du das verstehst, ist es eine einfache (oder zumindest leichtere) Aufgabe, unerwünschtes (schlechtes) Verhalten zu beseitigen.
Ein interessanter Aspekt bei der Arbeit an der Java-Performance ist, dass Entwickler oft einen ganz anderen Hintergrund haben als Ingenieure in einer Performance- oder QS-Gruppe. Ich kenne Entwickler, die sich an Tausende von obskuren Methodensignaturen für wenig genutzte Java-APIs erinnern können, aber keine Ahnung haben, was das Flag -Xmn
bedeutet. Und ich kenne Testingenieure, die durch das Setzen verschiedener Flags für den Garbage Collector jedes Quäntchen Leistung herausholen können, aber kaum ein geeignetes "Hello, World"-Programm in Java schreiben können.
Die Leistung von Java deckt beide Bereiche ab: Tuning-Flags für den Compiler und den Garbage Collector und so weiter sowie bewährte Methoden für die Nutzung der APIs. Ich gehe also davon aus, dass du weißt, wie man Programme in Java schreibt. Auch wenn dein Hauptinteresse nicht den Programmieraspekten von Java gilt, verbringe ich ziemlich viel Zeit damit, Programme zu besprechen, einschließlich der Beispielprogramme, die viele der Datenpunkte in den Beispielen liefern.
Wenn dein Hauptinteresse jedoch der Leistung der JVM selbst gilt, d. h. der Frage, wie du das Verhalten der JVM ohne Programmieraufwand ändern kannst, sollten große Teile dieses Buches dennoch von Nutzen für dich sein. Du kannst die Teile, in denen es um die Programmierung geht, ruhig überspringen und dich auf die Bereiche konzentrieren, die dich interessieren. Vielleicht erfährst du nebenbei, wie Java-Anwendungen die Leistung der JVM beeinflussen können, und kannst den Entwicklern Änderungen vorschlagen, die dir das Testen der Leistung erleichtern.
Was ist neu in der zweiten Ausgabe?
Seit der ersten Ausgabe hat Java einen halbjährlichen Release-Zyklus mit regelmäßigen Langzeit-Releases; das heißt, die aktuellen unterstützten Releases, die mit der Veröffentlichung zusammenfallen, sind Java 8 und Java 11. Obwohl die erste Ausgabe Java 8 behandelte, war es damals noch recht neu. Diese Ausgabe konzentriert sich auf ein viel ausgereifteres Java 8 und Java 11, mit wichtigen Updates für den G1 Garbage Collector und den Java Flight Recorder. Außerdem werden die Änderungen im Verhalten von Java in containerisierten Umgebungen berücksichtigt.
Diese Ausgabe deckt neue Funktionen der Java-Plattform ab, darunter ein neues Microbenchmarking-Harness (jmh
), neue Just-in-Time-Compiler, die gemeinsame Nutzung von Daten in Anwendungsklassen und neue Performance-Tools sowie neue Java 11-Funktionen wie kompakte Strings und String-Verkettung.
In diesem Buch verwendete Konventionen
In diesem Buch werden die folgenden typografischen Konventionen verwendet:
- Kursiv
-
Weist auf neue Begriffe, URLs, E-Mail-Adressen, Dateinamen und Dateierweiterungen hin.
Constant width
-
Wird für Programmlistings sowie innerhalb von Absätzen verwendet, um auf Programmelemente wie Variablen- oder Funktionsnamen, Datenbanken, Datentypen, Umgebungsvariablen, Anweisungen und Schlüsselwörter hinzuweisen.
Constant width bold
-
Zeigt Befehle oder anderen Text an, der vom Benutzer wortwörtlich eingetippt werden sollte.
Constant width italic
-
Zeigt Text an, der durch vom Benutzer eingegebene Werte oder durch kontextabhängige Werte ersetzt werden soll.
Dieses Element steht für eine Zusammenfassung der wichtigsten Punkte.
Code-Beispiele verwenden
Zusätzliches Material (Code-Beispiele, Übungen usw.) steht unter https://github.com/ScottOaks/JavaPerformanceTuning zum Download bereit .
Dieses Buch soll dir helfen, deine Arbeit zu erledigen. Wenn in diesem Buch Beispielcode angeboten wird, darfst du ihn in deinen Programmen und deiner Dokumentation verwenden. Du musst uns nicht um Erlaubnis fragen, es sei denn, du reproduzierst einen großen Teil des Codes. Wenn du zum Beispiel ein Programm schreibst, das mehrere Teile des Codes aus diesem Buch verwendet, brauchst du keine Erlaubnis. Der Verkauf oder die Verbreitung von Beispielen aus O'Reilly-Büchern erfordert jedoch eine Genehmigung. Die Beantwortung einer Frage mit einem Zitat aus diesem Buch und einem Beispielcode erfordert keine Genehmigung. Wenn du einen großen Teil des Beispielcodes aus diesem Buch in die Dokumentation deines Produkts aufnimmst, ist eine Genehmigung erforderlich .
Wir schätzen die Namensnennung, verlangen sie aber nicht. Eine Quellenangabe umfasst normalerweise den Titel, den Autor, den Verlag und die ISBN. Zum Beispiel: "Java Performance von Scott Oaks (O'Reilly). Copyright 2020 Scott Oaks, 978-1-492-05611-9."
Wenn du der Meinung bist, dass die Verwendung von Code-Beispielen nicht unter die Fair-Use-Regelung oder die oben genannte Erlaubnis fällt, kannst du uns gerne unter http://oreilly.com kontaktieren .
O'Reilly Online Learning
Seit mehr als 40 Jahren bietet O'Reilly Media Schulungen, Wissen und Einblicke in Technologie und Wirtschaft, um Unternehmen zum Erfolg zu verhelfen.
Unser einzigartiges Netzwerk von Experten und Innovatoren teilt sein Wissen und seine Erfahrung durch Bücher, Artikel, Konferenzen und unsere Online-Lernplattform. Die Online-Lernplattform von O'Reilly bietet dir On-Demand-Zugang zu Live-Trainingskursen, ausführlichen Lernpfaden, interaktiven Programmierumgebungen und einer umfangreichen Text- und Videosammlung von O'Reilly und über 200 anderen Verlagen. Weitere Informationen findest du unter http://oreilly.com.
Wie du uns kontaktierst
Bitte richte Kommentare und Fragen zu diesem Buch an den Verlag:
- O'Reilly Media, Inc.
- 1005 Gravenstein Highway Nord
- Sebastopol, CA 95472
- 800-998-9938 (in den Vereinigten Staaten oder Kanada)
- 707-829-0515 (international oder lokal)
- 707-829-0104 (Fax)
Wir haben eine Webseite für dieses Buch, auf der wir Errata, Beispiele und zusätzliche Informationen auflisten. Du kannst diese Seite unter https://oreil.ly/java-performance-2e aufrufen .
Schreib eine E-Mail an bookquestions@oreilly.com, um Kommentare oder technische Fragen zu diesem Buch zu stellen.
Weitere Informationen zu unseren Büchern, Kursen, Konferenzen und Neuigkeiten findest du auf unserer Website unter http://www.oreilly.com.
Finde uns auf Facebook: http://facebook.com/oreilly
Folge uns auf Twitter: http://twitter.com/oreillymedia
Schau uns auf YouTube: http://www.youtube.com/oreillymedia
Danksagungen
Ich möchte mich bei allen bedanken, die mir bei der Arbeit an diesem Buch geholfen haben. In vielerlei Hinsicht ist dieses Buch eine Ansammlung von Wissen, das ich in den letzten 20 Jahren in der Java Performance Group und anderen Entwicklungsgruppen bei Sun Microsystems und Oracle gesammelt habe. Allen Ingenieuren, mit denen ich in dieser Zeit zusammengearbeitet habe, und besonders denen, die im letzten Jahr geduldig meine Fragen beantwortet haben, möchte ich danken!
Mein besonderer Dank gilt Stanley Guan, Azeem Jiva, Kim LiChong, Deep Singh, Martijn Verburg und Edward Yue Shung Wong, die sich die Zeit genommen haben, Entwürfe durchzusehen und mir wertvolles Feedback zu geben. Ich bin mir sicher, dass sie nicht alle meine Fehler finden konnten, aber das Material hier wurde durch ihren Beitrag stark verbessert. Die zweite Ausgabe wurde durch die gründliche und durchdachte Hilfe von Ben Evans, Rod Hilton und Michael Hunger erheblich verbessert. Meine Kollegen Eric Caspole, Charlie Hunt und Robert Strout von der Oracle HotSpot Performance Group haben mir ebenfalls geduldig bei einer Reihe von Problemen in der zweiten Auflage geholfen.
Das Produktionsteam von O'Reilly war wie immer sehr hilfreich. Ich hatte das Privileg, bei der ersten Ausgabe mit der Redakteurin Meg Blanchette zusammenzuarbeiten, und Amelia Blevins hat die zweite Ausgabe mit Bedacht und Sorgfalt geleitet. Vielen Dank für all die Ermutigung während des Prozesses! Schließlich muss ich meinem Mann James dafür danken, dass er die langen Nächte und die Abendessen am Wochenende ertragen hat, bei denen ich ständig abgelenkt war.
Get Java Performance, 2. Auflage now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.