Hallo zusammen! Dies ist der zweite Beitrag unserer Quarkus-Serie â heute sprechen wir ĂŒber die native Kompilierung.

â das ist ein Java-Stack, der fĂŒr optimiert ist. Und obwohl es hier natĂŒrlich noch viel zu tun gibt, haben wir viele Aspekte gut bearbeitet, einschlieĂlich der Optimierung von JVM und einer Reihe von Frameworks. Ein besonderes Merkmal von Quarkus, das das Interesse der Entwickler geweckt hat, ist der umfassende nahtlose Ansatz zur Umwandlung von Java-Code in ausfĂŒhrbare Dateien fĂŒr ein bestimmtes Betriebssystem (die sogenannte "native Kompilierung"), Ă€hnlich wie bei C und C++, wo diese Kompilierung normalerweise am Ende eines Zyklus stattfindet, der aus Erstellung, Test und Bereitstellung besteht.
Und obwohl die native Kompilierung, wie wir im Folgenden zeigen werden, wichtig ist, sollte man beachten, dass Quarkus tatsĂ€chlich auch auf einer ganz normalen Java-Maschine mit OpenJDK Hotspot gut funktioniert, dank der Leistungsverbesserungen, die wir im gesamten Stack implementiert haben. Daher sollte native Kompilierung als zusĂ€tzlicher Bonus betrachtet werden, den man nach Wunsch oder Bedarf verwenden kann. TatsĂ€chlich stĂŒtzt sich Quarkus in Bezug auf native Images in erheblichem MaĂe auf OpenJDK. Der von den Entwicklern gut angenommene Entwicklungsmodus ermöglicht nahezu sofortige Tests von Ănderungen dank der erweiterten dynamischen CodeausfĂŒhrungsfunktionen, die in Hotspot implementiert sind. DarĂŒber hinaus wird bei der Erstellung nativer Images die OpenJDK-Klassenbibliothek und die FĂ€higkeit von HotSpot genutzt.
Warum ist dann native Kompilierung notwendig, wenn alles bereits hervorragend optimiert ist? Diese Frage werden wir im Folgenden zu beantworten versuchen.
Fangen wir mit dem Offensichtlichen an: Red Hat hat umfangreiche Erfahrungen in der Optimierung von JVMs, Stacks und Frameworks im Verlauf des Projekts. , einschlieĂlich:
- Der erste Anwendungsserver fĂŒr den Einsatz in der Cloud auf der Plattform .
- Der erste Anwendungsserver fĂŒr den Einsatz auf Rechnern .
- Der erste Anwendungsserver fĂŒr den Einsatz auf .
- Eine Reihe von Projekten, die auf GerÀten laufen .
Wir beschĂ€ftigen uns seit vielen Jahren mit dem Start von Java-Anwendungen in der Cloud und auf ressourcenbeschrĂ€nkten GerĂ€ten (sprich, IoT) und haben gelernt, das Maximum aus der JVM in Bezug auf Leistung und Speichereffizienz herauszuholen. Wie viele andere arbeiten wir seit Langem mit der nativen Kompilierung von Java-Anwendungen ĂŒber , , und sogar und wir sind uns der Vor- und Nachteile dieses Ansatzes bewusst (zum Beispiel das Dilemma der Wahl zwischen der Vielseitigkeit "build once â run-anywhere" und dem Vorteil, dass kompilierte Anwendungen eine kleinere GröĂe haben und schneller starten).
Warum ist es so wichtig, diese Vor- und Nachteile zu berĂŒcksichtigen? Weil in bestimmten Situationen ihr VerhĂ€ltnis entscheidend wird:
- Zum Beispiel in serverlosen/ereignisgesteuerten Umgebungen, in denen in einem (strengen oder lockeren) Echtzeitmodus laufen mĂŒssen, um auf Ereignisse zu reagieren. Im Gegensatz zu langlebigen persistenten Diensten erhöht hier die Dauer des Kaltstarts kritisch die Antwortzeit auf Anfragen. Der Start der JVM benötigt immer noch erhebliche Zeit, und obwohl man in einigen FĂ€llen die Zeit rein hardwareseitig reduzieren kann, kann der Unterschied zwischen einer Sekunde und 5 Millisekunden eine Frage von Leben und Tod sein. Ja, hier kann man mit der Erstellung von Hot-Standby-Java-Maschinen experimentieren (was wir zum Beispiel bei ), aber das allein garantiert nicht genĂŒgend JVMs, um die Anforderungen bei steigender Last zu bewĂ€ltigen. Auch aus wirtschaftlicher Sicht ist das sicherlich nicht die beste Lösung.
- DarĂŒber hinaus gibt es einen hĂ€ufig auftretenden Aspekt, die Multitenanz. Obwohl JVMs in ihren FĂ€higkeiten den Betriebssystemen stark nĂ€her gekommen sind, sind sie immer noch nicht in der Lage, das zu tun, was wir im gleichen Linux gewohnt sind â die Isolierung von Prozessen. Daher kann ein Fehler in einem Thread die gesamte Java-Maschine zum Absturz bringen. Viele versuchen, diesen Nachteil zu umgehen, indem sie fĂŒr jede Anwendung eines Benutzers eine separate JVM bereitstellen, um die Auswirkungen eines Ausfalls zu minimieren. Das ist durchaus sinnvoll, harmoniert aber schlecht mit der Skalierung.
- AuĂerdem ist fĂŒr cloudorientierte Anwendungen ein Indikator wichtig, wie die Dichte der Dienste auf dem Host. Der Ăbergang zur Methodik , Mikrodienste und Kubernetes erhöhen die Anzahl der Java-Maschinen pro Anwendung. Das bedeutet, dass dies einerseits FlexibilitĂ€t und ZuverlĂ€ssigkeit bietet, andererseits jedoch auch der Grundverbrauch an Speicher pro Dienst steigt, wobei ein Teil dieser Kosten nicht immer unbedingt erforderlich ist. Statisch kompilierte Executables profitieren hier von verschiedenen Optimierungstechniken, wie der Low-Level-Dead-Code-Eliminierung, bei der nur die Teile der Frameworks (einschlieĂlich des JDK), die der Dienst tatsĂ€chlich nutzt, in das endgĂŒltige Image aufgenommen werden. Daher hilft die native Kompilierung von Quarkus dabei, Instanzen von Diensten dichter auf dem Host zu platzieren, ohne die Sicherheit zu gefĂ€hrden.
Die oben genannten Argumente sind bereits ausreichend, um die Berechtigung der nativen Kompilierung aus der Perspektive der Teilnehmer des Quarkus-Projekts zu verstehen. Es gibt jedoch noch einen weiteren, nicht technischen, aber ebenso wichtigen Grund: In den letzten Jahren haben viele Programmierer und Entwicklungsunternehmen Java zugunsten neuer Programmiersprachen aufgegeben, da sie der Meinung sind, dass Java zusammen mit ihrer JVM, den Stacks und Frameworks zu speicherhungrig und zu langsam geworden ist.
Allerdings ist es nicht immer richtig, das gleiche Werkzeug fĂŒr alle Aufgaben zu verwenden â . Manchmal ist es besser, einen Schritt zurĂŒckzutreten und nach etwas anderem zu suchen. Wenn Quarkus die Menschen dazu bringt, eine Pause einzulegen und nachzudenken, ist das gut fĂŒr das gesamte Java-Ăkosystem. Quarkus verkörpert einen innovativen Ansatz dafĂŒr, wie man effizientere Anwendungen erstellt und Java relevanter fĂŒr neue Anwendungsarchitekturen wie serverless macht. DarĂŒber hinaus hoffen wir, dass Quarkus dank seiner Erweiterbarkeit ein ganzes Ăkosystem von Java-Erweiterungen schafft, das die Anzahl der Frameworks erheblich erhöht, die nativ in Anwendungen unterstĂŒtzt werden.
Quelle: habr.com
