Java Virtual Machine - Pengumpulan Sampah
Siklus hidup objek Java dikelola oleh JVM. Setelah objek dibuat oleh pemrogram, kita tidak perlu khawatir tentang sisa siklus hidupnya. JVM secara otomatis akan menemukan objek yang tidak digunakan lagi dan mengambil kembali memorinya dari heap.
Pengumpulan sampah adalah operasi besar yang dilakukan JVM dan menyesuaikannya dengan kebutuhan kita dapat memberikan peningkatan kinerja yang besar pada aplikasi kita. Ada berbagai algoritme pengumpulan sampah yang disediakan oleh JVM modern. Kita perlu menyadari kebutuhan aplikasi kita untuk memutuskan algoritma mana yang akan digunakan.
Anda tidak dapat membatalkan alokasi objek secara terprogram di Java, seperti yang dapat Anda lakukan dalam bahasa non-GC seperti C dan C ++. Oleh karena itu, Anda tidak dapat memiliki referensi yang menjuntai di Jawa. Namun, Anda mungkin memiliki referensi null (referensi yang merujuk ke area memori di mana JVM tidak akan pernah menyimpan objek). Setiap kali referensi null digunakan, JVM akan menampilkan NullPointerException.
Perhatikan bahwa meskipun jarang menemukan kebocoran memori di program Java berkat GC, kebocoran itu bisa terjadi. Kami akan membuat kebocoran memori di akhir bab ini.
GC berikut digunakan dalam JVM modern
- Kolektor serial
- Pengumpul hasil
- Kolektor CMS
- Kolektor G1
Masing-masing algoritme di atas melakukan tugas yang sama - menemukan objek yang tidak lagi digunakan dan mendapatkan kembali memori yang ditempati di heap. Salah satu pendekatan naif untuk ini adalah menghitung jumlah referensi yang dimiliki setiap objek dan membebaskannya segera setelah jumlah referensi berubah 0 (ini juga dikenal sebagai penghitungan referensi). Mengapa ini naif? Pertimbangkan daftar tertaut melingkar. Setiap node akan memiliki referensi ke sana, tetapi seluruh objek tidak direferensikan dari mana pun, dan idealnya harus dibebaskan.
JVM tidak hanya membebaskan memori, tetapi juga menggabungkan potongan memori kecil menjadi lebih besar. Ini dilakukan untuk mencegah fragmentasi memori.
Singkatnya, algoritme GC biasa melakukan aktivitas berikut -
- Menemukan benda yang tidak digunakan
- Membebaskan memori yang mereka tempati di heap
- Menggabungkan fragmen
GC harus menghentikan thread aplikasi saat sedang berjalan. Ini karena ia memindahkan objek saat dijalankan, dan oleh karena itu, objek tersebut tidak dapat digunakan. Pemberhentian semacam itu disebut 'jeda stop-the-world dan meminimalkan frekuensi dan durasi jeda ini adalah tujuan kami saat menyetel GC kami.
Penggabungan Memori
Demonstrasi sederhana penggabungan memori ditunjukkan di bawah ini
Bagian yang diarsir adalah objek yang perlu dibebaskan. Bahkan setelah semua ruang diambil kembali, kita hanya dapat mengalokasikan objek dengan ukuran maksimum = 75Kb. Ini bahkan setelah kami memiliki 200 KB ruang kosong seperti yang ditunjukkan di bawah ini