Table des matières
1. Pourquoi avez-vous besoin de la fonction étrangère et de l'API de mémoire?
2. Explication détaillée des composants centraux
2. ValueLayout et MemoryLayout: Définition de mise en page de la mémoire
3. Symbollookup: trouver des symboles de fonction locale
4. FunctionDescriptor et méthode Handle: Définissez et appelez les fonctions externes
Exemple: appel printf de c
3. Appel d'une bibliothèque locale personnalisée (exemple simple)
Iv. Arena: gestion du cycle de vie de la mémoire
5. Avantages par rapport à JNI
6. État actuel et précautions
Maison Java javaDidacticiel L'API de fonction et de mémoire étrangères dans Java 21

L'API de fonction et de mémoire étrangères dans Java 21

Jul 29, 2025 am 01:16 AM
java api

Java 21 a introduit l'API Fonction et mémoire étrangère pour résoudre la complexité, la sécurité médiocre et les surcharges importantes de JNI; 2. Les composants de base incluent MemorySegment (Abstraction de mémoire), ValuElayout / MemoryLayout (Memory Layout), Symbollookup (Function Symbol Lookup), FunctionDescriptor et MethodHandle (Fonction Call Definition), Arena (Memory Lifecycle Management); 3. Le code Java pur peut appeler les fonctions locales et fonctionner de mémoire hors trémoine en toute sécurité et efficacement, sans écrire de code C ni gérer manuellement la mémoire; 4. Par rapport à JNI, l'API FFM offre une sécurité de type plus solide, une gestion automatique de la mémoire, de meilleures performances et une sécurité plus élevée; 5. Actuellement en Java, la fonction d'aperçu en 21 nécessite la preuve enable. Il n'est pas recommandé pour une utilisation dans les environnements de production et devrait être officiellement libéré dans les versions suivantes.

L'API de fonction et de mémoire étrangères dans Java 21

Java 21 présente l'API Fonction & Memory Frorest Function & Memory (API FFM), une nouvelle fonctionnalité importante conçue pour permettre aux programmes Java d'appeler en toute sécurité et efficacement les bibliothèques locales (telles que les bibliothèques de liens dynamiques écrites en C / C) et d'interagir avec la mémoire hors têtes. Il remplace le JNI de longue date mais problématique (interface native Java), offrant une façon plus moderne, concise et plus sûre de gérer l'interopérabilité avec le code natif.

L'API de fonction et de mémoire étrangères dans Java 21

L'objectif principal de cette API est de permettre à Java d'accéder naturellement aux fonctions locales et à la mémoire comme appeler des méthodes locales, tout en évitant la complexité et les risques de sécurité de JNI.


1. Pourquoi avez-vous besoin de la fonction étrangère et de l'API de mémoire?

Avant Java 21, l'interaction avec le code natif repose principalement sur JNI , mais il a de nombreux problèmes:

L'API de fonction et de mémoire étrangères dans Java 21
  • Complexe et compliqué : il nécessite d'écrire du code C, de générer des fichiers d'en-tête, de compiler les bibliothèques partagées et le processus de développement n'est pas fluide.
  • Sous les erreurs : la gestion manuelle des conversions de mémoire et de type peut facilement entraîner des accidents (tels que Segfaults).
  • Performance Overhead : les appels JNI ont des coûts de commutation contextuels élevés.
  • Mauvaise sécurité : fonctionnement direct des pointeurs, manque de vérification des limites d'accès à la mémoire.

L'émergence de l'API de fonction et de mémoire étrangère est de résoudre ces problèmes et fournit un moyen Java pur d'implémenter les appels de fonction externes et les opérations de mémoire.


2. Explication détaillée des composants centraux

L'API FFM est principalement composée des classes clés suivantes, situées dans java.lang.foreign :

L'API de fonction et de mémoire étrangères dans Java 21

1. Memory-Segment: Abstraction of Off-Heap Memory

MemorySegment représente une zone de mémoire continue, qui peut être en tas ou hors de la mémoire locale. Il s'agit d'une encapsulation sécurisée de la mémoire brute.

 // allouer 100 octets d'essai de mémoire hors trémail (segment de la mémoire = mémoire.
    segment.set (java_int, 0, 42); // Écrivez Int à Offset 0
    int value = segment.get (java_int, 0); // lire System.out.println (valeur); // Sortie 42
}
  • Utilisez allocateNative() pour allouer la mémoire locale.
  • Utilisez set() / get() pour coopérer avec ValueLayout (comme JAVA_INT ) pour la lecture et l'écriture dactylographiques.
  • Il doit être utilisé dans try-with-resources pour s'assurer que la mémoire est libérée dans le temps.

2. ValueLayout et MemoryLayout: Définition de mise en page de la mémoire

Utilisé pour décrire la disposition des structures de données, telles que les types de base, les structures, les tableaux, etc.

 VALUELAYOUT.OFINT INT = VALUELAYOUT.JAVA_INT;
SequenceLayout Arraylayout = MemoryLayout.SenenceLayout (10, int); // int [10]

Ces dispositions peuvent être utilisées pour construire des types de paramètres de fonction ou des cartes de structure.

3. Symbollookup: trouver des symboles de fonction locale

Utilisé pour localiser les adresses de fonction dans les bibliothèques dynamiques.

 Symbollookup lookup = symbollookup.librarylookup ("libc.so.6"); // Linux
// ou symbollookup.librarylookup ("msvcrt.dll") sur Windows

4. FunctionDescriptor et méthode Handle: Définissez et appelez les fonctions externes

FunctionDescriptor décrit les paramètres et les types de retour de la fonction, et combine Linker pour obtenir la MethodHandle callable.

Exemple: appel printf de c
 import java.lang.foreign. *;
Importer Static Java.lang.Foreign.valuuelayout. *;

Linker linker = linker.nativeLinker ();
Symbollookup stdlib = linker.defaultlookup ();

// Définir la signature de la fonction printf: int printf (const char *, ...)
FunctionDescriptor printfDesc = functionDescriptor.of (java_int, adresse);

MethodHandle printf = linker.downCallHandle (stdlib.find ("printf"). OrelSethrow (), printfDesc);

// Préparer la chaîne (doit se terminer avec null)
Try (Arena Arena = Arena.OfConfined ()) {
    MemorySegment Format = Arena.AllocateFrom ("Hello From% S! \ N");
    MemorySegment Name = Arena.AllOcAnfrom ("API FFM");

    // Appel printf
    printf.invoke (format, nom);
}

Sortir:

 Bonjour de l'API FFM!

Remarque: La fonction du paramètre variable prend en charge la prise en charge limitée. Dans cet exemple, seuls deux paramètres sont passés, vous devez donc être prudent lorsque vous l'utilisez.


3. Appel d'une bibliothèque locale personnalisée (exemple simple)

Supposons que vous ayez une fonction C:

 // libadd.so (linux) / add.dll (windows)
int add (int a, int b) {
    retour AB;
}

Après avoir compilé dans une bibliothèque partagée, appelez-la en Java:

 Try (Arena Arena = Arena.OfConfined ()) {
    Linker linker = linker.nativeLinker ();
    Symbollookup lookup = linker.defaultlookup (); // ou spécifiez le chemin FunctionDescriptor addDesc = functionDescriptor.of (java_int, java_int, java_int);
    MethodHandle add = linker.downCallHandle (
        lookup.find ("add"). orelSethrow (),
        adddescs
    ));

    INT Result = (int) add.invoke (3, 4);
    System.out.println ("3 4 =" résultat); // Sortie 7
}

Pas besoin d'écrire du code JNI, cela se fait entièrement dans la couche Java.


Iv. Arena: gestion du cycle de vie de la mémoire

Java 21 présente le concept Arena pour unifier le cycle de vie de MemorySegment .

  • Arena.ofConfined() : Accès à thread unique, bonnes performances.
  • Arena.ofShared() : Partage multi-thread, plus sûr mais avec des frais généraux de synchronisation.
 Try (Arena Arena = Arena.OfConfined ()) {
    MemorySegment seg = Arena.ALLOCY (100);
    // Utilisez SEG ...
} // libérer automatiquement toute la mémoire

Il s'agit d'un mécanisme clé pour empêcher les fuites de mémoire.


5. Avantages par rapport à JNI

caractéristiques JNI API FFM
Avez-vous besoin de code natif? Oui Non
Gestion de la mémoire Manuel (sujet à l'erreur) Gestion automatique de l'arène
Type Sécurité Faible (définition macro) Strong (ValueLayout)
performance Généralement, les frais généraux d'appel sont élevés Mieux, JVM peut être optimisé
Facilité d'utilisation complexe Java simple et pur
Sécurité Bas (pointeur direct) Haut (vérification des frontières)

6. État actuel et précautions

  • La fonction d'aperçu est toujours dans Java 21 et l'option d'aperçu doit être activée:
     Javac - Release 21 - enrôlant votreclass.java
    java - enrôlant votre classe
  • L'API peut être ajustée à l'avenir et n'est pas recommandée pour une utilisation dans les environnements de production jusqu'à ce qu'ils deviennent permanents (Java 22 ou 23 est attendu).
  • Le soutien aux structures complexes (telles que les structures imbriquées, les syndicats) est améliorée.
  • La compatibilité multiplateforme nécessite une attention aux noms de bibliothèque et aux conventions d'appel (telles que STDCALL pour Windows).

  • Fondamentalement, c'est tout. L'API de fonction et de mémoire étrangère est une étape importante pour la programmation Java au niveau du système, marquant que Java devient de plus en plus "proche du matériel" tout en restant sécurisé et concis. Il deviendra progressivement la solution préférée pour les scénarios qui nécessitent des appels locaux haute performance (tels que des bases de données, des intégrations de bibliothèque AI, des outils du système d'exploitation).

    Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Stock Market GPT

Stock Market GPT

Recherche d'investissement basée sur l'IA pour des décisions plus intelligentes

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Résolution des problèmes communs de Java NullpointerException avec facultatif Résolution des problèmes communs de Java NullpointerException avec facultatif Aug 31, 2025 am 07:11 AM

Facultatif est une classe de conteneurs introduite par Java 8. Il est utilisé pour indiquer clairement qu'une valeur peut être vide, évitant ainsi NullPointerException; 2. Il simplifie la vérification null nul en fournissant MAP, Orelse et d'autres méthodes, empêchant les méthodes de renvoyer les valeurs de rendement de la collection NULL et de normaliser; 3. Les meilleures pratiques incluent uniquement les valeurs de retour, d'éviter l'utilisation de champs ou de paramètres, de distinguer Orelse de Orelseget, et de ne pas appeler Get () directement; 4. Facultatif ne doit pas être abusé. Si les méthodes non vides n'ont pas besoin d'être enveloppées, les opérations facultatives inutiles doivent être évitées dans le flux; L'utilisation correcte de facultatif peut considérablement améliorer la sécurité et la lisibilité du code, mais elle nécessite de bonnes habitudes de programmation.

Modifier les signets dans Chrome Modifier les signets dans Chrome Aug 27, 2025 am 12:03 AM

L'édition de signets de Chrome est simple et pratique. Les utilisateurs peuvent saisir le gestionnaire de signets via les touches de raccourci Ctrl Shift O (Windows) ou CMD Shift O (Mac), ou entrer dans le menu du navigateur; 1. Lors de la modification d'un seul signet, cliquez avec le bouton droit pour sélectionner "Modifier", modifiez le titre ou l'URL et cliquez sur "Terminer" pour enregistrer; 2. Lorsque vous organisez des signets par lots, vous pouvez maintenir CTRL (ou CMD) dans des signets à choix multiples dans le gestionnaire de signets, cliquez avec le bouton droit pour sélectionner "passer à" ou "Copier" le dossier cible; 3. Lors de l'exportation et de l'importation de signets, cliquez sur le bouton "Résoudre" pour sélectionner "Exporter Bookmark" pour enregistrer en tant que fichier HTML, puis restaurer la fonction "Importer Bookmark" si nécessaire.

Les paramètres de jeu lol n'enregistrent pas après la fermeture [fixe] Les paramètres de jeu lol n'enregistrent pas après la fermeture [fixe] Aug 24, 2025 am 03:17 AM

IfleagueoflegendSettingSaren’ssaving, tryTheSesteps: 1.RunthegameasAdministrator.2.grantfullfolderpermissionstotheagueoflegendDirectory.3.Editandensuregame.cfgisn’Tread-only.4.DisableCloudsyNcfortaGamefolder.5.

Entrez la touche ne fonctionnant pas sur mon clavier Entrez la touche ne fonctionnant pas sur mon clavier Aug 30, 2025 am 08:36 AM

Tout d'abord, CheckForPhysicsUesuesLikeeDebrisordAmageAndCleantheyBoardOrtestwithanExternalone; 2.TestertheenterkeyIndifferentAppstodetermineiftheissueIssoftware-spécifique; 3.restartyourcomputertoresolvetetemporaryglitches; 4.DisableStickykeys, Filterkeys, Ortogglek

Que sont les cours de wrapper et pourquoi sont-ils utilisés en Java? Que sont les cours de wrapper et pourquoi sont-ils utilisés en Java? Sep 01, 2025 am 05:58 AM

WrapperclassesaSareUsedToconvertprimeTatatyTySIntoObjects, permettant à la consommation, permettant de surtout, fournissant des méthodes et de la supportation d'auto-oboxing / déborde.

Qu'est-ce qu'une fuite de mémoire en Java? Qu'est-ce qu'une fuite de mémoire en Java? Aug 28, 2025 am 05:37 AM

AmemémoryleakinjavaoccurSwhenUnReachableObjectsarenotgarBageCollecyDuetolingingreFerences, seadtoExcessiveMemoryusageAndPotentialoutoutofMemoryError.ComMonCauseSeSestaticCollesectionreweting

La demande n'a pas pu être effectuée en raison d'une erreur de périphérique d'E / S [6 solutions] La demande n'a pas pu être effectuée en raison d'une erreur de périphérique d'E / S [6 solutions] Aug 23, 2025 pm 02:12 PM

Ifyouencounterani / odeviceerror, tryTheSesteps: 1.restartyourcomputerAndDevice.2.replacetheusbcableorport.3.UpdateorreinstallthedevicedRiver.4.RunchkdsktofixDiskerror.5retide / satransferModeWeveNegener.6.SishignanwDredeterIndiskman de gestion.

Comment trouver la valeur max ou min dans un flux en Java Comment trouver la valeur max ou min dans un flux en Java Aug 27, 2025 am 04:14 AM

Utilisez les méthodes max () et min () pour combiner le comparateur pour trouver les valeurs maximales et minimales dans le flux, telles que Comparator.NaturalOrder () ou Integer :: Comparez les types de base; 2. Pour les objets personnalisés, utilisez Comparator.Charepring () pour comparer en fonction de champs spécifiques, tels que Person :: Getage; 3. Étant donné que le résultat est facultatif, la situation du flux vide doit être gérée. Vous pouvez utiliser iSpresent () pour vérifier ou orelse () pour fournir des valeurs par défaut. Il est recommandé d'utiliser IntStream pour les types de base pour éviter de boxer les frais généraux et d'améliorer les performances. En fin de compte, vous devriez toujours être correctement terminé.

See all articles