Inhaltsverzeichnis
1. Warum brauchen Sie die Fremdfunktion und die Speicher -API?
2. Detaillierte Erklärung der Kernkomponenten
2. Valuelayout und MemoryLayout: Speicherlayout -Definition
3. Symbollookup: Finden Sie lokale Funktionssymbole
4. FunctionDescriptor und MethodHandle: Definieren und rufen Sie externe Funktionen auf und rufen Sie sie auf
Beispiel: printf von C aufrufen
3.. Aufrufen einer benutzerdefinierten lokalen Bibliothek (einfaches Beispiel)
Iv. Arena: Memory Life Cycle Management
5. Vorteile im Vergleich zu JNI
6. Aktueller Status und Vorsichtsmaßnahmen
Heim Java javaLernprogramm Die Fremdfunktion und Speicher -API in Java 21

Die Fremdfunktion und Speicher -API in Java 21

Jul 29, 2025 am 01:16 AM
java api

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.

Die Fremdfunktion und Speicher -API in Java 21

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.

Die Fremdfunktion und Speicher -API in Java 21

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:

Die Fremdfunktion und Speicher -API in Java 21
  • 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:

Die Fremdfunktion und Speicher -API in Java 21

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 mit ValueLayout (wie JAVA_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!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

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

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

PHP-Tutorial
1537
276
Excel finden und ersetzen Sie nicht funktionieren Excel finden und ersetzen Sie nicht funktionieren Aug 13, 2025 pm 04:49 PM

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

Bereitstellung einer Java -Anwendung Bereitstellung einer Java -Anwendung Aug 17, 2025 am 12:56 AM

Vorbereitungsdauerung von MajoringMavenorgradletobuildajarorwarfile, ExternalizingConfiguration

Wie konfigurieren Sie die Protokollierung in einer Java -Anwendung? Wie konfigurieren Sie die Protokollierung in einer Java -Anwendung? Aug 15, 2025 am 11:50 AM

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

XML -Datenbindung mit Castor in Java XML -Datenbindung mit Castor in Java Aug 15, 2025 am 03:43 AM

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

Js fügen Element hinzu, um Array zu beginnen Js fügen Element hinzu, um Array zu beginnen Aug 14, 2025 am 11:51 AM

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.

Leistungsvergleich: Java vs. Go for Backend Services Leistungsvergleich: Java vs. Go for Backend Services Aug 14, 2025 pm 03:32 PM

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

Wie man mit JSON in Java arbeitet Wie man mit JSON in Java arbeitet Aug 14, 2025 pm 03:40 PM

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

Was ist das Assert -Schlüsselwort in Java? Was ist das Assert -Schlüsselwort in Java? Aug 17, 2025 am 12:52 AM

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

See all articles