Bekerja dengan Generasi Objek
Pengumpul sampah Java menerapkan strategi pengumpulan sampah generasi yang dapat mengklasifikasikan objek berdasarkan usia.
Kebutuhan seperti itu (untuk menandai dan memadatkan semua objek) di JVM bisa disebut tidak efisien. Karena sejumlah besar objek dialokasikan, daftarnya bertambah, yang mengarah pada peningkatan waktu pengumpulan sampah. Analisis empiris aplikasi telah menunjukkan bahwa sebagian besar objek di Java berumur pendek.
Area memori tumpukan di JVM dibagi menjadi tiga bagian:
Generasi yang lebih muda
Objek yang baru dibuat dimulai dari generasi muda. Generasi muda dibagi lagi menjadi dua kategori.
- Eden Space - Semua objek baru dimulai di sini, mereka dialokasikan memori awal.
Survivor Spaces (FromSpace dan ToSpace) - Objek dipindahkan ke sini dari Eden setelah selamat dari satu siklus pengumpulan sampah.
Proses ketika objek sampah dikumpulkan dari generasi muda disebut acara pengumpulan sampah kecil.
Saat ruang Eden dipenuhi benda, dilakukan pengumpulan sampah kecil. Semua benda mati dipindahkan, dan semua yang hidup dipindahkan ke salah satu dari dua ruang yang tersisa. GC kecil juga memeriksa objek di ruang penyintas dan memindahkannya ke ruang penyintas lain (berikutnya).
Mari kita ambil urutan berikut sebagai contoh.
- Ada objek dari kedua jenis (hidup dan mati) di Eden.
- Terjadi GC kecil - semua benda mati dikeluarkan dari Eden. Semua benda hidup dipindahkan ke ruang-1 (FromSpace). Eden dan ruang-2 kini kosong.
- Objek baru dibuat dan ditambahkan ke Eden. Beberapa objek di Eden dan ruang-1 menjadi mati.
- Terjadi GC kecil - semua benda mati dikeluarkan dari Eden dan ruang-1. Semua benda hidup dipindahkan ke ruang-2 (ToSpace). Eden dan ruang-1 kosong.
Sehingga setiap saat salah satu ruang survivor selalu kosong. Saat penyintas mencapai ambang tertentu untuk bergerak melalui ruang penyintas, mereka maju ke generasi yang lebih tua.
Anda dapat menggunakan flag -Xmn untuk mengatur ukuran generasi muda .
Generasi tua
Objek yang hidup dalam waktu yang signifikan (misalnya, sebagian besar masa hidup program) akhirnya menjadi objek yang lebih tua - centenarian. Ia juga dikenal sebagai generasi reguler dan berisi objek yang telah lama ditinggalkan di Survivor Spaces.
Ambang batas seumur hidup objek menentukan berapa banyak siklus pengumpulan sampah yang harus dilaluinya sebelum dipindahkan ke generasi yang lebih tua. Proses ketika objek dikirim ke sampah dari generasi yang lebih tua disebut acara pengumpulan sampah utama.
Anda dapat menggunakan flag -Xms dan -Xmx untuk menyetel ukuran memori heap awal dan maksimum .
Karena Java menggunakan pengumpulan sampah generasional, semakin banyak peristiwa pengumpulan sampah yang dialami objek, semakin jauh ia bergerak di heap. Dia mulai dari generasi yang lebih muda dan akhirnya berakhir di generasi biasa jika dia hidup cukup lama.
Untuk memahami promosi objek antar ruang dan generasi, perhatikan contoh berikut:
Ketika sebuah objek diciptakan, pertama-tama ditempatkan di ruang Eden generasi muda.
Segera setelah pengumpulan sampah kecil terjadi, benda hidup dari Eden dipindahkan ke FromSpace. Saat pengumpulan sampah kecil berikutnya terjadi, benda hidup dari Eden dan luar angkasa dipindahkan ke ToSpace.
Siklus ini berlanjut beberapa kali. Jika objek masih "berfungsi" setelah titik ini, siklus pengumpulan sampah berikutnya akan memindahkannya ke ruang generasi lama.
Generasi permanen dan metaspace
Metadata seperti kelas dan metode disimpan dalam generasi persisten. JVM mengisinya saat runtime berdasarkan kelas yang digunakan oleh aplikasi. Kelas yang tidak lagi digunakan dapat berubah dari generasi permanen menjadi sampah.
Anda dapat menggunakan tanda -XX:PermGen dan -XX:MaxPermGen untuk mengatur ukuran awal dan maksimum generasi permanen .
ruang meta
Sejak Java 8, ruang PermGen telah digantikan oleh ruang memori MetaSpace. Implementasinya berbeda dari PermGen - ruang heap ini sekarang diubah secara otomatis.
Hal ini untuk menghindari masalah kehabisan memori aplikasi yang terjadi karena terbatasnya ukuran ruang heap PermGen. Memori metaspace dapat dikumpulkan dari sampah, dan kelas yang tidak lagi digunakan akan dibersihkan secara otomatis saat metaspace mencapai ukuran maksimumnya.
GO TO FULL VERSION