Die Fremdfunktion und Speicher -API in Java 21
Java 21 führte die Fremdenfunktions- und Speicher -API ein, um die Komplexität, die schlechte Sicherheit und die große Leistungsaufwand von JNI zu lösen. 2. Die Kernkomponenten umfassen MemorySegment (Speicherabstraktion), Valuelayout/MemoryLayout (Speicherlayout), Symbollookup (Funktionsymbol -Lookup), FunctionDescriptor und MethodHandle (Funktionsaufrufdefinition), Arena (Speicherlebenszyklusverwaltung); 3. Pure Java-Code kann lokale Funktionen aufrufen und sicher und effizient außerhalb des HEAP-Speichers arbeiten, ohne C-Code zu schreiben oder den Speicher manuell zu verwalten. 4. Im Vergleich zu JNI bietet die FFM -API eine stärkere Sicherheit, automatische Speichermanagement, eine bessere Leistung und höhere Sicherheit. 5. Derzeit in Java erfordert die Vorschau-Funktion in 21 die Aktivierung der Aktivierung. Es wird nicht für den Einsatz in Produktionsumgebungen empfohlen und wird voraussichtlich in nachfolgenden Versionen offiziell freigegeben.
Java 21 führt die Fremdfunction & Memory API (FFM API) vor, eine wichtige neue Funktion, mit der Java-Programme sicher und effizient lokale Bibliotheken (z. B. in C/C geschriebene dynamische Linkbibliotheken) aufrufen und mit dem Off-HEAP-Speicher interagieren können. Es ersetzt die langjährige, aber problematische JNI (Java Native Interface) und bietet eine modernere, prägnantere und sicherere Möglichkeit, die Interoperabilität mit nativem Code zu bewältigen.

Das Kernziel dieser API ist es, Java zu ermöglichen, auf lokale Funktionen zuzugreifen und auf natürliche Weise wie das Aufrufen lokaler Methoden zuzugreifen und gleichzeitig die Komplexitäts- und Sicherheitsrisiken von JNI zu vermeiden.
1. Warum brauchen Sie die Fremdfunktion und die Speicher -API?
Vor Java 21 stützt sich die Interaktion mit nativem Code hauptsächlich auf JNI , hat aber viele Probleme:

- Komplex und kompliziert : Es erfordert das Schreiben von C -Code, das Generieren von Header -Dateien, das Kompilieren gemeinsamer Bibliotheken und der Entwicklungsprozess ist nicht reibungslos.
- Fehleranfälliger : Manuelles Verwalten von Speicher- und Typkonvertierungen kann leicht zu Abstürzen (z. B. SEGFAULTS) führen.
- Leistungsaufwand : JNI -Aufrufe haben hohe Kontextschaltkosten.
- Schlechte Sicherheit : Direkter Betrieb von Zeigern, mangelnde Speichergrenzen für Speicherzugriffsgrenzen.
Die Entstehung der Fremdfunktion und der Speicher -API besteht darin, diese Probleme zu lösen, und bietet eine reine Java -Möglichkeit, externe Funktionsaufrufe und Speichervorgänge zu implementieren.
2. Detaillierte Erklärung der Kernkomponenten
Die FFM -API besteht hauptsächlich aus den folgenden Schlüsselklassen im java.lang.foreign
-Paket:

1. MemorySegment: Abstraktion des Off-HEAP-Speichers
MemorySegment
repräsentiert einen kontinuierlichen Speicherbereich, der sich in oder aus dem Haufen oder sogar aus dem lokalen Speicher befinden kann. Es ist eine sichere Einkapselung des Rohspeichers.
// 100 Bytes von Off-HEAP-Speicher-Versuch zuweisen (MemorySegment Segment = memorySegment.Allocatenative (100)) { Segment.set (java_int, 0, 42); // Int in Offset 0 schreiben 0 int value = segment.get (java_int, 0); // system.out.println (Wert) lesen; // Ausgabe 42 }
- Verwenden Sie
allocateNative()
, um den lokalen Speicher zuzuweisen. - Verwenden Sie
set()
/get()
um mitValueLayout
(wieJAVA_INT
) zusammenzuarbeiten, um typisierte Lesen und Schreiben zu erhalten. - Es muss in
try-with-resources
verwendet werden, um sicherzustellen, dass der Speicher rechtzeitig freigegeben wird.
2. Valuelayout und MemoryLayout: Speicherlayout -Definition
Wird verwendet, um das Layout von Datenstrukturen wie Grundtypen, Strukturen, Arrays usw. zu beschreiben.
Valuelayout.Ofint int = Valuelayout.java_int; SequencElayout arrayLayout = majeMeLayout.sequenCelayout (10, int); // int [10]
Diese Layouts können verwendet werden, um Funktionsparametertypen oder Strukturkarten zu erstellen.
3. Symbollookup: Finden Sie lokale Funktionssymbole
Wird verwendet, um Funktionadressen in dynamischen Bibliotheken zu finden.
Symbollookup shoqule = symbolookup.librarylookup ("libc.so.6"); // Linux // oder symbolookup.librarylookup ("msvcrt.dll") unter Windows
4. FunctionDescriptor und MethodHandle: Definieren und rufen Sie externe Funktionen auf und rufen Sie sie auf
FunctionDescriptor
beschreibt die Parameter und Rückgabetypen der Funktion und kombiniert Linker
, um den Callable MethodHandle
zu erhalten.
Beispiel: printf
von C aufrufen
Java.lang.foreign importieren.*; statische java.lang.foreign.Valuelayout importieren.*; Linker linker = linker.natelinker (); Symbollookup stdlib = linker.defaultLookup (); // Definieren Sie die Printf -Funktion Signatur: int printf (const char*, ...) FunctionDescriptor printfDesc = functionDescriptor.of (java_int, Adresse); MethodHandle printf = linker.downcallHandle (stdlib.find ("printf"). Orelsethrow (), printfdesc); // String vorbereiten (muss mit null enden) Versuchen Sie (Arena Arena = Arena.OfConfined ()) { Memorysegment format = Arena.AlleCocateFrom ("Hallo aus %s! \ N"); Memorysegment name = arena.alcodeFrom ("ffm api"); // printf rufen printf.invoke (Format, Name); }
Ausgabe:
Hallo von FFM API!
Hinweis: Die Funktion der variablen Parameter unterstützt begrenzte Unterstützung. In diesem Beispiel werden nur zwei Parameter übergeben, sodass Sie bei der Verwendung vorsichtig sein müssen.
3.. Aufrufen einer benutzerdefinierten lokalen Bibliothek (einfaches Beispiel)
Angenommen, Sie haben eine C -Funktion:
// libadd.so (Linux) / add.dll (Windows) int add (int a, int b) { Rückkehr AB; }
Rufen Sie sie nach dem Zusammenstellen einer gemeinsamen Bibliothek in Java an:
Versuchen Sie (Arena Arena = Arena.OfConfined ()) { Linker linker = linker.natelinker (); Symbolookup shookup = linker.defaultLookup (); // oder geben Sie den PfadfunktionDescriptor addDesc = functionDescriptor.of (java_int, java_int, java_int) an; MethodHandle add = linker.downcallHandle ( Lookup.find ("hinzufügen"). Orelsethrow (),, Adddesc ); int result = (int) add.invoke (3, 4); System.out.println ("3 4 =" Ergebnis); // Ausgabe 7 }
Sie müssen keinen JNI -Code schreiben, sondern vollständig in der Java -Ebene.
Iv. Arena: Memory Life Cycle Management
Java 21 führt das Arena -Konzept ein, um den Lebenszyklus von MemorySegment
zu vereinen.
-
Arena.ofConfined()
: Einzelfadenzugang, gute Leistung. -
Arena.ofShared()
: Multi-Thread-Sharing, sicherer, aber mit Synchronisationsaufwand.
Versuchen Sie (Arena Arena = Arena.OfConfined ()) { Memorysegment SEG = Arena.Alldocal (100); // benutze SEG ... } // automatisch den gesamten Speicher loslassen
Dies ist ein Schlüsselmechanismus, um Speicherlecks zu verhindern.
5. Vorteile im Vergleich zu JNI
Merkmal | Jni | FFM API |
---|---|---|
Benötigen Sie einen nativen Code? | Ja | NEIN |
Speicherverwaltung | Handbuch (anfällig für Fehler) | Arena Automatisches Management |
Geben Sie Sicherheit ein | Schwach (Makrodefinition) | Stark (Valuelayout) |
Leistung | Im Allgemeinen ist der Anrufaufwand hoch | Besser, JVM kann optimiert werden |
Benutzerfreundlichkeit | Komplex | Einfacher, reiner Java |
Sicherheit | Niedrig (direkter Zeiger) | Hoch (Grenzprüfung) |
6. Aktueller Status und Vorsichtsmaßnahmen
- Die Vorschau -Funktion befindet sich noch in Java 21 , und die Vorschau -Option muss aktiviert sein:
Javac-Release 21-ANBABE-PREVVIEW yourclass.java Java-ANBABE-PREVVIVE YOUSCASS
- Die API kann in Zukunft angepasst werden und wird nicht für die Verwendung in Produktionsumgebungen empfohlen, bis sie dauerhaft werden (Java 22 oder 23 wird erwartet).
- Die Unterstützung komplexer Strukturen (z. B. verschachtelte Strukturen, Gewerkschaften) wird verbessert.
- Die plattformübergreifende Kompatibilität erfordert Aufmerksamkeit auf Bibliotheksnamen und aufgerufene Konventionen (z. B. STDCall für Windows).
Grundsätzlich ist das. Die Fremdfunction & Memory-API ist ein wichtiger Schritt für Java-to-System-Ebene-Programmierung und markiert, dass Java "nahe an Hardware" wird und gleichzeitig sicher und präzise bleibt. Es wird nach und nach die bevorzugte Lösung für Szenarien, für die lockene Aufrufe von leistungsstarken Aufrufen erforderlich sind (z. B. Datenbanken, Integrationen der KI-Bibliothek, Betriebssystem-Tools).
Das obige ist der detaillierte Inhalt vonDie Fremdfunktion und Speicher -API in Java 21. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undress AI Tool
Ausziehbilder kostenlos

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

CheckSearchsets -ähnliche "MatchentirecellContents" und "Matchcase" ByexpandingOptionssinfindandReplace, sorgen für "Lookin" IssettoValuesand "Innere" toCorrectScope;

Vorbereitungsdauerung von MajoringMavenorgradletobuildajarorwarfile, ExternalizingConfiguration

Die Verwendung von SLF4J in Kombination mit Logback oder Log4J2 ist die empfohlene Möglichkeit, Protokolle in Java -Anwendungen zu konfigurieren. Es wird API- und Implementierungsbibliotheken eingeführt, indem entsprechende Maven -Abhängigkeiten hinzugefügt werden. 2. Rufen Sie den Logger durch den LoggerFactory von SLF4J im Code und schreiben Sie mit parametrisierten Protokollierungsmethoden entkoppelten und effizienten Protokollcode. 3. Definieren Sie das Protokoll -Ausgangsformat, die Ebene, das Ziel (Konsole, die Datei) und die Paket -Level -Protokollregelung über logback.xml oder log4j2.xml Konfigurationsdateien; 4. Aktivieren Sie optional die Funktionsscanning -Funktion der Konfigurationsdatei, um eine dynamische Anpassung der Protokollebene zu erreichen, und Springboot kann auch über den Aktuatorendpunkte verwaltet werden. 5. Befolgen Sie Best Practices, einschließlich

Castorensxml-to-javaObjectMappingviadefaultConventionsorexplicitMapPingFiles; 1) DefineJavaclasses witgers/setzer;

In JavaScript ist die häufigste Methode, um Elemente zu Beginn eines Arrays hinzuzufügen, die Verwendung der Unshift () -Methode. 1. Wenn Sie Unshift () verwenden, können Sie das ursprüngliche Array direkt ändern. Sie können ein oder mehrere Elemente hinzufügen, um die neue Länge des hinzugefügten Arrays zurückzugeben. 2. Wenn Sie das ursprüngliche Array nicht ändern möchten, wird empfohlen, den Erweiterungsoperator (z. B. [NewLement, ... arr]) zu verwenden, um ein neues Array zu erstellen. 3.. Sie können auch die concat () -Methode verwenden, um das neue Element -Array mit der ursprünglichen Nummer zu kombinieren, das neue Array zurückgibt, ohne das ursprüngliche Array zu ändern. Zusammenfassend verwenden Sie Unshift () beim Ändern des ursprünglichen Arrays und empfehlen Sie den Erweiterungsoperator, wenn Sie das ursprüngliche Array unverändert halten.

GotypicaloffersBetterRuntimePerformance withHoGherThroughputandLowerLatency, insbesondere um/o-HeavyServices, DuetoitSLightgoroutinesandefficientScheduler, während Java, obwohl SlowertOstart, Canmatchgoincpu-BoundtaksafterTimization.2.2

TOCHORKWITHJSONINJAVA, Useathird-partylibrary-Likejackson, Gson, Orjson-B, Asjavalacksbuilt-Insupport; 2.FordeSerialisierung, MapjsontojavaObjectSuSusingObjectMapperinjacksonorgson.fromjson;

TheassertKeywordinjavaisUsedTovalidateAsStionsduringDevelopment, ThrowinganasStorionErroriftheConditionisfalse.2.ithastWOforms: AssertCondition; andassertCondition: message; withelatterProvrididing -Kustomerform
