MemorySegment en Arena
Off-heapgeheugen alloceren
MemorySegment en Arena is een gratis Java Academy-les op CoddyKit. Dit is les 2 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Java Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Java Academy bevat in totaal 4 lessen.
Geheugen buiten de heap
FFM modelleert native geheugen buiten de heap met twee centrale typen: MemorySegment vertegenwoordigt een aaneengesloten geheugengebied en Arena beheert de levensduur ervan.
Samen vervangen ze het onveilige handmatige bufferbeheer uit het verleden.
Wat is een MemorySegment
Een MemorySegment is een getypeerd venster op een geheugenblok. Het kent zijn grootte en levensduur, en elke toegang wordt gecontroleerd op grenzen.
Segmenten kunnen zich buiten de heap bevinden (native) of een array op de heap omhullen.
Wat is een Arena
Een Arena wijst segmenten toe en bepaalt wanneer ze worden vrijgegeven. Wanneer de arena wordt gesloten, worden al zijn segmenten in één voorspelbare stap ongeldig.
Arena.ofConfined(): één thread, expliciet sluitenArena.ofShared(): toegang vanuit meerdere threadsArena.global(): wordt nooit vrijgegevenArena.ofAuto(): wordt door de GC vrijgegeven
Een segment toewijzen
Een arena met beperkte toegang in een try-with-resources-constructie is het gebruikelijke patroon. Wijs bytes toe, gebruik ze en laat het sluiten alles vrijgeven.
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");
}
}Schrijven en lezen
Je leest en schrijft via getypeerde toegangsfuncties die een ValueLayout en een offset gebruiken. Zo blijft de toegang typeveilig en correct uitgelijnd.
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);
}
}
}Getypeerde vakken toewijzen
Wijs in plaats van losse aantallen bytes toe op basis van een layout. arena.allocate(JAVA_INT) reserveert precies genoeg, correct uitgelijnde bytes voor één int.
Zo vermijd je handmatige berekeningen van de grootte.
Arrays met waarden
Als je meerdere elementen wilt opslaan, wijs je een sequence-layout toe of geef je een aantal op. Toegang via een index gebruikt een offset die wordt berekend op basis van de elementgrootte.
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));
}
}
}Grenscontroles
Lezen of schrijven buiten een segment veroorzaakt IndexOutOfBoundsException. Toegang tot een segment nadat de bijbehorende arena is gesloten, veroorzaakt IllegalStateException.
Dankzij deze controles is FFM geheugenveilig, terwijl JNI dat niet was.
Threadisolatie
Een arena met beperkte toegang koppelt zijn segmenten aan de thread die ze heeft gemaakt. Als een andere thread ze benadert, ontstaat WrongThreadException.
Gebruik voor echt gedeeld geheugen Arena.ofShared(). Daarmee is toegang vanuit meerdere threads toegestaan, tegen geringe kosten.
Werken met tekenreeksen
FFM biedt hulpfuncties om Java-tekenreeksen en C-tekenreeksen met elkaar te verbinden. allocateUtf8String (nieuwer: allocateFrom) schrijft een nulafgesloten tekenreeks en getUtf8String leest er een terug.
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));
}
}
}Een Arena kiezen
Richtlijnen:
- Kortlevende buffers voor één thread:
ofConfined() - Gedeeld tussen threads:
ofShared() - Levensduur beheerd door de GC:
ofAuto() - Procesbrede constanten:
global()
Korte controle
Bedenk wat bepaalt wanneer native geheugen wordt vrijgegeven.
Samenvatting
Je hebt geleerd hoe je geheugen buiten de heap beheert:
MemorySegment: een geheugengebied met grenscontrolesArena: beheert de levensduur (beperkte toegang, gedeeld, automatisch of globaal)- Getypeerde toegang via
ValueLayoutmetget/setengetAtIndex - Veiligheid dankzij grenscontroles en threadisolatie
Volgende: native functies aanroepen met downcall-handles.
Leer Java met een AI-tutor — gratis
Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.
- Cursussen
- 104
- Lessen
- 374
Veelgestelde vragen
Is de les “MemorySegment en Arena” gratis?
Ja — de volledige tekst van “MemorySegment en Arena” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus Java Academy wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus Java Academy bevat in totaal 4 lessen.
Wat leer ik in “MemorySegment en Arena”?
Off-heapgeheugen alloceren Je oefent met Java Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.
Heb ik ervaring nodig om met Java Academy te beginnen?
Ervaring vooraf is niet nodig. Java Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 2 van 4.
Hoe lang duurt de les “MemorySegment en Arena”?
De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.
Kan ik code schrijven en uitvoeren in deze les over Java Academy?
Ja. Elke les over Java Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.
Alle lessen in deze cursus
- Waarom FFM boven JNI
- MemorySegment en Arena
- Downcall-handles
- Layouts en structs