0Pricing
Java Academy · Pelajaran

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 eksplisit
  • Arena.ofShared(): akses dari banyak utas
  • Arena.global(): tidak pernah dibebaskan
  • Arena.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 batas
  • Arena: mengendalikan masa hidup (terbatas, dibagikan, otomatis, global)
  • Akses bertipe melalui ValueLayout dengan get/set dan getAtIndex
  • 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

  1. Mengapa FFM, bukan JNI
  2. MemorySegment dan Arena
  3. Handle Downcall
  4. Layout dan Struct
← Kembali ke Java Academy