Java Academy · Les

MemorySegment en Arena

Off-heapgeheugen alloceren

Les 2 van 413 stappen

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 sluiten
  • Arena.ofShared(): toegang vanuit meerdere threads
  • Arena.global(): wordt nooit vrijgegeven
  • Arena.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 grenscontroles
  • Arena: beheert de levensduur (beperkte toegang, gedeeld, automatisch of globaal)
  • Getypeerde toegang via ValueLayout met get/set en getAtIndex
  • Veiligheid dankzij grenscontroles en threadisolatie

Volgende: native functies aanroepen met downcall-handles.

Gratis beginnen

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

  1. Waarom FFM boven JNI
  2. MemorySegment en Arena
  3. Downcall-handles
  4. Layouts en structs
← Terug naar Java Academy