L'API de fonction et de mémoire étrangères dans Java 21
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.
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'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:

- 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
:

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 avecValueLayout
(commeJAVA_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!

Outils d'IA chauds

Undress AI Tool
Images de déshabillage gratuites

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

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

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

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

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

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.

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]](https://img.php.cn/upload/article/001/431/639/175597664176545.jpg?x-oss-process=image/resize,m_fill,h_207,w_330)
IfleagueoflegendSettingSaren’ssaving, tryTheSesteps: 1.RunthegameasAdministrator.2.grantfullfolderpermissionstotheagueoflegendDirectory.3.Editandensuregame.cfgisn’Tread-only.4.DisableCloudsyNcfortaGamefolder.5.

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

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

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]](https://img.php.cn/upload/article/001/431/639/175592952217836.jpg?x-oss-process=image/resize,m_fill,h_207,w_330)
Ifyouencounterani / odeviceerror, tryTheSesteps: 1.restartyourcomputerAndDevice.2.replacetheusbcableorport.3.UpdateorreinstallthedevicedRiver.4.RunchkdsktofixDiskerror.5retide / satransferModeWeveNegener.6.SishignanwDredeterIndiskman de gestion.

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é.
