Java Academy · Oppitunti

MemorySegment ja Arena

Varaa off-heap-muistia.

Oppitunti 2/413 vaihetta

MemorySegment ja Arena on ilmainen Java Academy-oppitunti CoddyKitissä. Tämä on oppitunti 2/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Java Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Java Academy-kurssilla on yhteensä 4 oppituntia.

Off-heap-muisti

FFM mallintaa natiivin, off-heap-muistin kahden keskeisen tyypin avulla: MemorySegment edustaa yhtenäistä muistialuetta, ja Arena hallitsee sen elinkaarta.

Yhdessä ne korvaavat aiemman turvattoman manuaalisen puskurien hallinnan.

Mikä MemorySegment on

MemorySegment on tyypitetty näkymä muistilohkoon. Se tietää kokonsa ja elinkaarensa, ja jokainen käyttö tarkistetaan rajojen suhteen.

Segmentit voivat olla off-heap-muistissa (natiivimuistissa) tai kääriä heapissa olevan taulukon.

Mikä Arena on

Arena varaa segmenttejä ja määrittää, milloin ne vapautetaan. Kun arena suljetaan, kaikki sen segmentit muuttuvat kelpaamattomiksi yhdellä deterministisellä toimenpiteellä.

  • Arena.ofConfined(): yksi säie, eksplisiittinen sulkeminen
  • Arena.ofShared(): käyttö useista säikeistä
  • Arena.global(): ei koskaan vapauteta
  • Arena.ofAuto(): roskienkeräin vapauttaa

Segmentin varaaminen

Try-with-resources-lohkossa käytettävä säiekohtainen arena on tyypillinen toimintamalli. Varatkaa tavut, käyttäkää niitä, ja sulkeminen vapauttaa kaiken.

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");
    }
}

Kirjoittaminen ja lukeminen

Luette ja kirjoitatte tietoja tyypitettyjen accessorien avulla. Ne saavat parametrikseen ValueLayout-asettelun ja siirtymän. Näin käyttö pysyy tyyppiturvallisena ja oikein kohdistettuna.

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);
        }
    }
}

Tyypitettyjen paikkojen varaaminen

Raakojen tavumäärien sijaan muistia varataan asettelun perusteella. arena.allocate(JAVA_INT) varaa täsmälleen yhdelle int-arvolle riittävän määrän oikein kohdistettuja tavuja.

Näin vältetään manuaalinen koon laskeminen.

Arvotaulukot

Kun haluatte tallentaa useita alkioita, varatkaa sekvenssiasettelu tai välittäkää lukumäärä. Indeksointi käyttää alkion koon perusteella laskettua siirtymää.

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));
        }
    }
}

Rajatarkistukset

Segmentin ulkopuolelta lukeminen tai siihen kirjoittaminen aiheuttaa IndexOutOfBoundsException-poikkeuksen. Segmentin käyttäminen sen Arena-alueen sulkemisen jälkeen aiheuttaa IllegalStateException-poikkeuksen.

Nämä tarkistukset tekevät FFM:n muistista turvallista siellä, missä JNI ei ollut.

Säiekohtaisuus

Säiekohtainen arena sitoo segmenttinsä niiden luoneeseen säikeeseen. Jos toinen säie käyttää niitä, seurauksena on WrongThreadException.

Jos muistia on aidosti jaettava, käyttäkää Arena.ofShared()-aluetta. Se sallii käytön useista säikeistä pientä kustannusta vastaan.

Merkkijonojen käsittely

FFM tarjoaa apuja Java-merkkijonojen ja C-merkkijonojen välille. allocateUtf8String (uudempi: allocateFrom) kirjoittaa null-päätteisen merkkijonon, ja getUtf8String lukee sen takaisin.

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));
        }
    }
}

Arenan valinta

Ohjeet:

  • Lyhytikäiset, yhden säikeen puskurit: ofConfined()
  • Säikeiden kesken jaettavat puskurit: ofShared()
  • Roskan­keräimen hallitsema elinkaari: ofAuto()
  • Koko prosessin vakiot: global()

Pikatarkistus

Palauttakaa mieleen, mikä määrittää natiivimuistin vapautusajankohdan.

Kertaus

Opitte hallitsemaan off-heap-muistia:

  • MemorySegment: rajatarkistettu muistialue
  • Arena: hallitsee elinkaarta (säiekohtainen, jaettu, automaattinen, globaali)
  • Tyypitetty käyttö ValueLayout-asettelun avulla metodeilla get/set ja getAtIndex
  • Rajatarkistusten ja säiekohtaisuuden tuoma turvallisuus

Seuraavaksi: natiivifunktioiden kutsuminen downcall-kahvojen avulla.

Aloita maksutta

Opi Java tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
104
Oppitunnit
374

Usein kysytyt kysymykset

Onko oppitunti ”MemorySegment ja Arena” ilmainen?

Kyllä – oppitunnin ”MemorySegment ja Arena” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Java Academy-kurssin, päivitä CoddyKit PROhon. Java Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”MemorySegment ja Arena”?

Varaa off-heap-muistia. Harjoittelet Java Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Java Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Java Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 2/4.

Kuinka kauan ”MemorySegment ja Arena”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Java Academy-oppitunnilla?

Kyllä. Jokainen Java Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Miksi FFM eikä JNI
  2. MemorySegment ja Arena
  3. Downcall-kahvat
  4. Asettelu ja rakenteet
← Takaisin: Java Academy