MemorySegment ja Arena
Varaa off-heap-muistia.
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 sulkeminenArena.ofShared(): käyttö useista säikeistäArena.global(): ei koskaan vapautetaArena.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() - Roskankeräimen hallitsema elinkaari:
ofAuto() - Koko prosessin vakiot:
global()
Pikatarkistus
Palauttakaa mieleen, mikä määrittää natiivimuistin vapautusajankohdan.
Kertaus
Opitte hallitsemaan off-heap-muistia:
MemorySegment: rajatarkistettu muistialueArena: hallitsee elinkaarta (säiekohtainen, jaettu, automaattinen, globaali)- Tyypitetty käyttö
ValueLayout-asettelun avulla metodeillaget/setjagetAtIndex - Rajatarkistusten ja säiekohtaisuuden tuoma turvallisuus
Seuraavaksi: natiivifunktioiden kutsuminen downcall-kahvojen avulla.
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
- Miksi FFM eikä JNI
- MemorySegment ja Arena
- Downcall-kahvat
- Asettelu ja rakenteet