MemorySegment e Arena
Allocare memoria fuori dall'heap
MemorySegment e Arena è una lezione Java Academy gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Java Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Java Academy include 4 lezioni in totale.
Memoria off-heap
FFM modella la memoria nativa off-heap con due tipi centrali: MemorySegment rappresenta una regione contigua di memoria, mentre Arena ne controlla la durata.
Insieme sostituiscono la gestione manuale e non sicura dei buffer usata in passato.
Che cos'è un MemorySegment
Un MemorySegment è una finestra tipizzata su un blocco di memoria. Conosce la propria dimensione e la propria durata, e ogni accesso è sottoposto a controllo dei limiti.
I segmenti possono essere off-heap (nativi) oppure avvolgere un array on-heap.
Che cos'è un Arena
Un Arena alloca segmenti e definisce quando vengono liberati. Quando l'arena viene chiusa, tutti i suoi segmenti diventano non validi in un'unica operazione deterministica.
Arena.ofConfined(): un solo thread, chiusura esplicitaArena.ofShared(): accesso da più threadArena.global(): non viene mai liberatoArena.ofAuto(): viene liberato dal GC
Allocazione di un segmento
Un'arena confinata in try-with-resources è il modello tipico. Allochi i byte, li utilizzi e la chiusura libera tutto.
import java.lang.foreign.*;
public class Main {
public static void main(String[] args) {
try (Arena arena = Arena.ofConfined()) {
MemorySegment seg = arena.allocate(16);
System.out.println("Allocated bytes: " + seg.byteSize());
}
System.out.println("Arena closed, memory freed");
}
}Scrittura e lettura
Si legge e si scrive tramite accessor tipizzati che accettano un ValueLayout e un offset. In questo modo l'accesso è sicuro rispetto ai tipi e correttamente allineato.
import java.lang.foreign.*;
public class Main {
public static void main(String[] args) {
try (Arena arena = Arena.ofConfined()) {
MemorySegment seg = arena.allocate(ValueLayout.JAVA_INT);
seg.set(ValueLayout.JAVA_INT, 0, 42);
int value = seg.get(ValueLayout.JAVA_INT, 0);
System.out.println("Stored and read: " + value);
}
}
}Allocazione di slot tipizzati
Invece di usare conteggi grezzi di byte, si alloca in base al layout. arena.allocate(JAVA_INT) riserva esattamente il numero di byte sufficiente, correttamente allineati, per un int.
Questo evita i calcoli manuali delle dimensioni.
Array di valori
Per memorizzare più elementi, si alloca un sequence layout o si passa un conteggio. L'accesso tramite indice usa un offset calcolato a partire dalla dimensione dell'elemento.
import java.lang.foreign.*;
public class Main {
public static void main(String[] args) {
try (Arena arena = Arena.ofConfined()) {
MemorySegment ints = arena.allocate(ValueLayout.JAVA_INT, 5);
for (int i = 0; i < 5; i++) {
ints.setAtIndex(ValueLayout.JAVA_INT, i, i * 10);
}
System.out.println("Element 3: " + ints.getAtIndex(ValueLayout.JAVA_INT, 3));
}
}
}Controllo dei limiti
La lettura o la scrittura oltre i limiti di un segmento genera IndexOutOfBoundsException. L'accesso a un segmento dopo la chiusura del relativo arena genera IllegalStateException.
Questi controlli rendono la memoria FFM sicura, a differenza di quella gestita tramite JNI.
Confinamento
Un'arena confinata associa i propri segmenti al thread che li ha creati. Se un altro thread vi accede, viene generata WrongThreadException.
Per la memoria realmente condivisa, usi Arena.ofShared(), che consente l'accesso da più thread con un costo contenuto.
Gestione delle stringhe
FFM offre funzioni di supporto per collegare le stringhe Java alle stringhe C. allocateUtf8String (nelle versioni più recenti: allocateFrom) scrive una stringa terminata da null, mentre getUtf8String ne legge una.
import java.lang.foreign.*;
public class Main {
public static void main(String[] args) {
try (Arena arena = Arena.ofConfined()) {
MemorySegment cString = arena.allocateUtf8String("hello");
System.out.println("Read back: " + cString.getUtf8String(0));
}
}
}Scelta di un'arena
Linee guida:
- Buffer di breve durata per un solo thread:
ofConfined() - Condivisi tra thread:
ofShared() - Durata gestita dal GC:
ofAuto() - Costanti a livello di processo:
global()
Verifica rapida
Ricordi che cosa determina quando viene liberata la memoria nativa.
Riepilogo
Ha appreso a gestire la memoria off-heap:
MemorySegment: una regione di memoria con controllo dei limitiArena: controlla la durata (confinata, condivisa, automatica, globale)- Accesso tipizzato tramite
ValueLayoutconget/setegetAtIndex - Sicurezza garantita dal controllo dei limiti e dal confinamento
Prossimo argomento: chiamare funzioni native con gli handle di downcall.
Domande Frequenti
La lezione «MemorySegment e Arena» è gratuita?
Sì — il testo completo di «MemorySegment e Arena» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Java Academy, passa a CoddyKit PRO. Il corso Java Academy include 4 lezioni in totale.
Cosa imparerò in «MemorySegment e Arena»?
Allocare memoria fuori dall'heap Eserciti Java Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Java Academy?
Non è richiesta alcuna esperienza precedente. Java Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.
Quanto tempo richiede la lezione «MemorySegment e Arena»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Java Academy?
Sì. Ogni lezione Java Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Perché FFM invece di JNI
- MemorySegment e Arena
- Handle per downcall
- Layout e struct