MemorySegment dan Arena
Alokasikan memori di luar heap.
MemorySegment dan Arena adalah pelajaran Java Academy gratis di CoddyKit. Ini adalah pelajaran 2 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Java Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Java Academy mencakup 4 pelajaran total.
Memori di Luar Heap
FFM memodelkan memori natif di luar heap dengan dua jenis utama: MemorySegment merepresentasikan wilayah memori yang berurutan, sedangkan Arena mengendalikan masa hidupnya.
Keduanya menggantikan pengelolaan penyangga manual yang tidak aman dari masa lalu.
Apa Itu MemorySegment
MemorySegment adalah jendela bertipe di atas suatu blok memori. Ia mengetahui ukurannya dan masa hidupnya, serta setiap akses diperiksa batasnya.
Segmen dapat berada di luar heap (natif) atau membungkus larik di heap.
Apa Itu Arena
Arena mengalokasikan segmen dan menentukan kapan segmen tersebut dibebaskan. Saat arena ditutup, semua segmennya menjadi tidak valid dalam satu langkah yang deterministik.
Arena.ofConfined(): satu utas, ditutup secara eksplisitArena.ofShared(): akses dari banyak utasArena.global(): tidak pernah dibebaskanArena.ofAuto(): dibebaskan oleh GC
Mengalokasikan Segmen
Menggunakan arena terbatas dalam pola try-with-resources adalah pola yang umum. Alokasikan byte, gunakan, lalu pemanggilan close akan membebaskan semuanya.
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");
}
}Menulis dan Membaca
Anda membaca dan menulis melalui pengakses bertipe yang menerima ValueLayout dan offset. Dengan begitu, akses tetap aman secara tipe dan selaras.
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);
}
}
}Mengalokasikan Slot Bertipe
Alih-alih menghitung byte mentah, lakukan alokasi berdasarkan tata letak. arena.allocate(JAVA_INT) menyediakan byte yang ukurannya tepat dan terselaraskan dengan benar untuk satu nilai int.
Hal ini menghindari perhitungan ukuran secara manual.
Larik Nilai
Untuk menyimpan beberapa elemen, alokasikan tata letak urutan atau berikan jumlah elemen. Akses berdasarkan indeks menggunakan offset yang dihitung dari ukuran elemen.
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));
}
}
}Pemeriksaan Batas
Membaca atau menulis di luar segmen akan memunculkan IndexOutOfBoundsException. Mengakses segmen setelah arenanya ditutup akan memunculkan IllegalStateException.
Pemeriksaan inilah yang membuat memori FFM aman, berbeda dengan JNI.
Pembatasan Akses
Arena terbatas mengikat segmennya ke utas yang membuatnya. Jika utas lain mengaksesnya, WrongThreadException akan muncul.
Untuk memori yang benar-benar dibagikan, gunakan Arena.ofShared(), yang mengizinkan akses dari banyak utas dengan sedikit biaya tambahan.
Bekerja dengan String
FFM menyediakan pembantu untuk menjembatani string Java dan string C. allocateUtf8String (versi yang lebih baru: allocateFrom) menulis string yang diakhiri null, sedangkan getUtf8String membacanya kembali.
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));
}
}
}Memilih Arena
Panduan:
- Penyangga berumur singkat dan digunakan oleh satu utas:
ofConfined() - Dibagikan antarutas:
ofShared() - Masa hidup dikelola oleh GC:
ofAuto() - Konstanta untuk seluruh proses:
global()
Pemeriksaan Singkat
Ingat kembali hal yang menentukan kapan memori natif dibebaskan.
Ringkasan
Anda telah mempelajari pengelolaan memori di luar heap:
MemorySegment: wilayah memori dengan pemeriksaan batasArena: mengendalikan masa hidup (terbatas, dibagikan, otomatis, global)- Akses bertipe melalui
ValueLayoutdenganget/setdangetAtIndex - Keamanan melalui pemeriksaan batas dan pembatasan akses
Selanjutnya: memanggil fungsi natif dengan referensi panggilan ke bawah.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “MemorySegment dan Arena” gratis?
Ya — teks lengkap “MemorySegment dan Arena” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Java Academy, upgrade ke CoddyKit PRO. Kursus Java Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “MemorySegment dan Arena”?
Alokasikan memori di luar heap. Kamu berlatih Java Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Java Academy?
Tidak diperlukan pengalaman sebelumnya. Java Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 4.
Berapa lama pelajaran “MemorySegment dan Arena” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Java Academy ini?
Ya. Setiap pelajaran Java Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Mengapa FFM, bukan JNI
- MemorySegment dan Arena
- Handle Downcall
- Layout dan Struct