Manajemen Memori di Java

⚡ Ringkasan Cerdas

Manajemen Memori di Java menjelaskan bagaimana JVM membagi memori runtime di antara Stack, Heap, Code, dan wilayah statis, bagaimana referensi objek mengalir selama panggilan metode, dan bagaimana Pengumpul Sampah mengklaim kembali objek yang tidak dapat dijangkau sehingga aplikasi tetap stabil dan bebas dari kebocoran memori.

  • 🧠 Tata Letak Memori JVM: Java Memori dibagi menjadi Heap untuk objek, Stack untuk frame metode dan variabel lokal, ditambah area khusus untuk bytecode dan data statis.
  • 📚 Stack vs Heap: Stack frame mengikuti urutan Last-In-First-Out (LIFO) dan menyimpan tipe data primitif dan referensi, sedangkan Heap menyimpan setiap objek yang dibuat dengan operator new.
  • ♻️ Pengumpulan Sampah: Pengumpul Sampah tracks dapat dijangkau melalui rantai referensi dan secara otomatis mengklaim kembali memori dari objek yang tidak dapat dijangkau oleh thread mana pun.
  • Kolektor Modern: Beban kerja produksi semakin bergantung pada G1, ZGC, dan Shenandoah untuk pengumpulan data dengan jeda rendah di seluruh heap multi-gigabyte.
  • 🧪 Contoh Praktis: Penjelasan langkah demi langkah dalam kelas Siswa menunjukkan kapan referensi menjadi layak untuk dikumpulkan dan bagaimana penghapusan referensi membebaskan objek yang mendasarinya.

Manajemen Memori di Java

Apa itu Stack Memory? Java?

Memori tumpukan di Java Stack adalah wilayah memori JVM yang menyimpan frame metode, variabel lokal, dan variabel referensi untuk setiap thread. Stack selalu diakses dalam urutan Last-In-First-Out (LIFO), sehingga metode yang paling baru dipanggil berada di atas, dan variabel lokalnya dimasukkan dan dikeluarkan bersamaan dengan frame tersebut.

Setiap utas dalam Java Mesin Virtual menerima Stack-nya sendiri, yang secara desain menjaga agar pemanggilan metode tetap terisolasi dan aman untuk thread. Variabel lokal primitif seperti int, boolean, dan double berada langsung di dalam frame, sementara referensi objek yang disimpan di Stack menunjuk ke objek yang dialokasikan di Heap.

Apa itu Memori Heap? Java?

Memori heap adalah wilayah JVM bersama yang menyimpan setiap Java Objek dan array yang dibuat dengan operator `new`, beserta variabel referensi apa pun yang dimiliki oleh objek tersebut sebagai field instance. Tidak seperti Stack, Heap dibagi di antara semua thread, itulah sebabnya akses objek sering kali memerlukan sinkronisasi.

Heap adalah area yang dikelola oleh Garbage Collector. JVM HotSpot modern membagi Heap menjadi Generasi Muda untuk objek berumur pendek dan Generasi Tua untuk objek berumur panjang, dengan metadata kelas disimpan di wilayah native terpisah yang disebut Metaspace.

Alokasi Memori di Java

Alokasi Memori di Java adalah proses di mana JVM menyisihkan wilayah memori virtual untuk variabel dan instance kelas serta struktur selama eksekusi program. Memori tidak dialokasikan ke objek saat deklarasi; hanya referensi yang dibuat. Alokasi objek sebenarnya terjadi melalui operator `new`, sehingga setiap objek berada di Heap.

The Java Alokasi memori dibagi menjadi beberapa bagian berikut:

  1. tumpukan
  2. Tumpukan
  3. Code
  4. Statis

Pembagian memori ini diperlukan untuk pengelolaan runtime yang efektif.

  • The Code bagian ini berisi kompilasi Anda bytecode.
  • The Tumpukan bagian toko metode, variabel lokal, dan variabel referensi.
  • The tumpukan bagian berisi objek dan mungkin juga berisi variabel referensi yang disimpan sebagai field instance.
  • The Statis bagian ini memuat data statis dan metode statis Dibagikan di semua instance.

Perbedaan antara Variabel Lokal dan Instance

Memahami letak setiap jenis variabel di JVM membantu menjelaskan perilaku Stack dan Heap. variabel instan dinyatakan di dalam kelas tetapi di luar metode apa pun, dan ia tinggal di Tumpukan sebagai bagian dari objeknya.

class Student{ 
int num; // num is instance variable 
public void showData{}

A variabel lokal dinyatakan di dalam sebuah metode, termasuk argumen metode, dan berada di Stack di dalam frame aktif.

public void sum(int a){

int x = a + 3;

// a, x are local variables

}

Perbedaan antara Tumpukan dan Tumpukan

Stack dan Heap memecahkan masalah yang berbeda di dalam JVM. Stack memberikan setiap thread alokasi yang cepat dan deterministik untuk data berumur pendek yang terikat pada cakupan metode, sementara Heap menyediakan wilayah bersama untuk objek berumur panjang yang dapat dirujuk oleh thread mana pun. Video singkat di bawah ini merangkum perbedaan tersebut sebelum penjelasan langkah demi langkah yang akan menyusul.

Klik di sini jika video tidak dapat diakses

Untuk melihat bagaimana Stack dan Heap bekerja sama, perhatikan sebuah metode utama yang memanggil metode m1.

public void m1{
int x = 20;
}

Di dalam Stack JVM, sebuah frame dibuat untuk metode m1.

Java Tumpukan dan Tumpukan

Variabel x dalam m1 juga dibuat dalam frame untuk m1 pada Stack, seperti yang ditunjukkan pada gambar di bawah ini.

Java Tumpukan dan Tumpukan

Metode m1 kemudian memanggil metode m2. Di dalam Stack, sebuah frame baru dibuat untuk m2 di atas frame untuk m1.

Java Tumpukan dan Tumpukan

Java Tumpukan dan Tumpukan

Variabel lokal b dan c juga dibuat di dalam frame untuk m2 pada Stack.

public void m2(int b){
boolean c;
}

Selanjutnya, m2 memanggil metode m3. Sekali lagi, sebuah frame untuk m3 dibuat di bagian atas Stack, seperti yang ditunjukkan di bawah ini.

Java Tumpukan dan Tumpukan

Java Tumpukan dan Tumpukan

Sekarang, misalkan metode m3 membuat objek untuk kelas Account, yang memiliki dua variabel instan ke dalam p dan ke dalam q.

class Account {
    int p;
    int q;
}

Berikut adalah kode untuk metode m3.

public void m3(){
    Account ref = new Account();
    // more code
}

Pernyataan `new Account()` membuat objek `Account` di Heap.

Java Tumpukan dan Tumpukan

Variabel referensi ref dibuat pada Stack di dalam frame untuk m3.

Java Tumpukan dan Tumpukan

Operator penugasan membuat variabel referensi menunjuk ke objek di Heap.

Java Tumpukan dan Tumpukan

Setelah metode tersebut selesai dieksekusi, kendali kembali ke metode pemanggil, yang dalam hal ini adalah metode m2.

Java Tumpukan dan Tumpukan

Frame untuk metode m3 dikeluarkan dari Stack.

Java Tumpukan dan Tumpukan

Karena variabel referensi tidak lagi menunjuk ke objek di Heap, objek tersebut memenuhi syarat untuk dikumpulkan oleh garbage collector.

Java Tumpukan dan Tumpukan

Setelah metode m2 selesai, metode tersebut dikeluarkan dari Stack dan semua variabelnya menjadi tidak tersedia. Hal yang sama terjadi pada metode m1, dan akhirnya kendali kembali ke metode utama.

Bagaimana jika sebuah objek menyimpan referensi lain sebagai variabel instansnya?

public static void main(String args[]) {
    A parent = new A();
    // more code
}
class A {
    B child = new B();
    int e;
}
class B {
    int c;
    int d;
}

Dalam hal ini, variabel referensi child berada di Heap sebagai bagian dari objek A, dan pada gilirannya menunjuk ke objek B-nya sendiri, seperti yang ditunjukkan di bawah ini.

Java Tumpukan dan Tumpukan

Apa yang dimaksud dengan Pengumpulan Sampah Java?

Pengumpulan Sampah di Java Ini adalah proses di mana JVM melakukan manajemen memori secara otomatis. Garbage Collector menemukan objek yang tidak lagi dapat dijangkau dari referensi aktif mana pun dan mengklaim kembali memorinya. Alokasi memori dinamis terjadi melalui operator `new`, dan memori tetap dialokasikan sampai program tidak lagi memegang referensi apa pun ke objek tersebut.

Ketika tidak ada lagi referensi yang tersisa, objek tersebut dianggap tidak lagi dibutuhkan, dan memori yang ditempatinya dapat dikembalikan. Tidak ada kebutuhan eksplisit untuk menghancurkan objek karena Java menangani pelepasan alokasi secara otomatis melalui Garbage Collector.

Teknik di balik ini dikenal sebagai Koleksi sampahProgram yang gagal melepaskan memori pada akhirnya akan mengalami crash ketika tidak ada lagi yang dapat dialokasikan. Program semacam itu dikatakan memiliki kebocoran memori. Pengumpulan Sampah di Java berjalan secara otomatis sepanjang masa berjalannya program, yang menghilangkan beban deallokasi manual dan mengurangi risiko kebocoran.

Sebaliknya, dalam bahasa C, programmer bertanggung jawab untuk melepaskan memori yang dialokasikan secara dinamis melalui fungsi free(). Di sinilah letak permasalahannya. Java Manajemen memori menawarkan keunggulan yang signifikan.

JVM HotSpot modern menyediakan beberapa Garbage Collector yang disetel untuk beban kerja yang berbeda. Garbage Collector G1 default menargetkan throughput dan waktu jeda yang seimbang pada heap multi-gigabyte. ZGC dan Shenandoah bertujuan untuk jeda di bawah milidetik pada heap yang sangat besar, yang membuat merekatracSangat penting untuk layanan yang sensitif terhadap latensi. Memilih kolektor yang tepat dan menyetel ukuran Young Generation, Old Generation, dan Metaspace adalah keterampilan inti untuk Java pekerjaan pertunjukan.

Catatan: Semua objek dibuat di bagian Heap dari memori, yang merupakan wilayah yang dikelola oleh Garbage Collector.

Contoh: Mempelajari Mekanisme Pengumpul Sampah di Java

Panduan ini menunjukkan kapan referensi memenuhi syarat untuk Pengumpulan Sampah (Garbage Collection) dalam program sederhana.

Langkah 1) Salin kode berikut ke editor.

class Student{
int a;
int b;
  public void setData(int c,int d){
    a=c;
    b=d;
  }
  public void showData(){
    System.out.println("Value of a = "+a);
    System.out.println("Value of b = "+b);
  }
  public static void main(String args[]){
    Student s1 = new Student();
    Student s2 = new Student();
    s1.setData(1,2);
    s2.setData(3,4);
    s1.showData();
    s2.showData();
    //Student s3;
    //s3=s2;
    //s3.showData();
    //s2=null;
    //s3.showData();
    //s3=null;
    //s3.showData();
  }
}

Langkah 2) Simpan, kompilasi, dan jalankan kode tersebut. Seperti yang ditunjukkan pada diagram, dua objek dan dua variabel referensi dibuat.

 Mekanisme Pengumpul Sampah

Langkah 3) Hapus tanda komentar pada baris 20, 21, dan 22. Simpan, kompilasi, dan jalankan kode tersebut.

Langkah 4) Seperti yang ditunjukkan pada diagram di bawah ini, dua variabel referensi sekarang menunjuk ke objek yang sama.

Mekanisme Pengumpul Sampah

Langkah 5) Hapus tanda komentar pada baris 23 dan 24. Simpan, kompilasi, dan jalankan kode.

Langkah 6) Seperti yang ditunjukkan di bawah ini, s2 menjadi null, tetapi s3 masih menunjuk ke objek tersebut, sehingga objek tersebut belum memenuhi syarat untuk pengumpulan sampah (garbage collection).

 Mekanisme Pengumpul Sampah

Langkah 7) Hapus tanda komentar pada baris 25 dan 26. Simpan, kompilasi, dan jalankan kode.

Langkah 8) Pada titik ini, tidak ada referensi yang mengarah ke objek tersebut, sehingga objek tersebut memenuhi syarat untuk Pengumpulan Sampah (Garbage Collection). Pengumpul Sampah menghapusnya dari memori, dan tidak ada cara untuk mengambilnya kembali.

 Pelajari Pengumpul Sampah

Cara Menghapus Objek di Java?

Java Tidak menyediakan operator penghapusan manual, jadi pendekatan standar adalah menghapus setiap referensi ke objek tersebut agar Garbage Collector dapat mengambilnya kembali.

1) Untuk membuat suatu objek memenuhi syarat untuk Pengumpulan Sampah (Garbage Collection), tetapkan setiap variabel referensi yang menunjuk ke objek tersebut menjadi null.

2) Tipe data primitif bukanlah objek, sehingga tidak dapat diberi nilai null. Penyimpanannya akan dikembalikan secara otomatis ketika frame tumpukan di sekitarnya dikeluarkan.

Cara menghapus objek di Java

Pertanyaan Umum Demo Slot

Stack menyimpan kerangka metode, variabel lokal, dan referensi dalam urutan Last-In-First-Out (LIFO) per thread. Heap menyimpan semua objek yang dibuat dengan `new` dan dibagi di antara thread, itulah sebabnya Garbage Collector mengelolanya.

Pengumpul Sampah (Garbage Collector) menelusuri rantai referensi dari akar GC seperti thread aktif dan field statis. Objek apa pun yang tidak dapat dijangkau dari akar dianggap tidak dapat dijangkau dan memenuhi syarat untuk diambil kembali selama siklus pengumpulan berikutnya.

Generasi Muda menyimpan objek berumur pendek di ruang Eden dan Survivor. Generasi Tua menyimpan objek yang bertahan melalui beberapa koleksi. Metaspace adalah wilayah memori asli yang menyimpan metadata kelas dan menggantikan PermGen yang lebih lama. Java 8.

G1 adalah pengaturan default dan cocok untuk sebagian besar beban kerja pada heap multi-gigabyte. ZGC dan Shenandoah menargetkan jeda sub-milidetik pada heap yang sangat besar dan merupakan pilihan yang baik untuk layanan yang sensitif terhadap latensi yang berjalan pada Java 17 atau lebih baru.

Atur setiap referensi yang menunjuk ke objek menjadi null, atau biarkan referensi tersebut keluar dari cakupan ketika frame Stack-nya dikeluarkan. Setelah tidak ada referensi aktif yang mencapai objek, Garbage Collector akan mengklaim kembali memori Heap-nya.

Ya. Alat penyetelan berbasis AI menganalisis log GC, tingkat alokasi, dan histogram jeda untuk merekomendasikan ukuran Heap, flag kolektor, dan rasio Generasi Muda. Alat ini mempersingkat siklus umpan balik dibandingkan dengan penyetelan manual, terutama pada beban kerja G1, ZGC, dan Shenandoah.

Platform observabilitas berbasis AI menyerap heap dump dan metrik langsung, kemudian mengelompokkan object graph yang dipertahankan untuk menandai kelas dan rantai referensi yang mencurigakan. Hal ini memunculkan kandidat kebocoran lebih cepat daripada analisis heap manual dan membantu tim menentukan akar penyebabnya di lingkungan produksi.

Ringkaslah postingan ini dengan: