Bekerja dengan Generasi Objek

Pengumpul sampah Java melaksanakan strategi pengumpulan sampah generasi yang boleh mengelaskan objek mengikut umur.

Keperluan sedemikian (untuk menandakan dan padat semua objek) dalam JVM boleh dipanggil tidak cekap. Memandangkan apabila sejumlah besar objek diperuntukkan, senarai mereka bertambah, yang membawa kepada peningkatan dalam masa pengumpulan sampah. Analisis empirikal aplikasi telah menunjukkan bahawa kebanyakan objek di Jawa adalah jangka pendek.

Kawasan ingatan timbunan dalam JVM dibahagikan kepada tiga bahagian:

Bekerja dengan Generasi Objek

Generasi muda

Objek yang baru dicipta bermula pada generasi muda. Generasi muda pula dibahagikan kepada dua kategori.

  • Eden Space - Semua objek baharu bermula di sini, ia diperuntukkan memori awal.
  • Survivor Spaces (FromSpace dan ToSpace) - Objek dialihkan ke sini dari Eden selepas terselamat daripada satu kitaran pengumpulan sampah.

Proses apabila objek adalah sampah yang dikutip daripada generasi muda dipanggil acara kutipan sampah kecil.

Apabila ruang Eden dipenuhi dengan objek, kutipan sampah kecil dilakukan. Semua objek mati dikeluarkan, dan semua yang hidup dialihkan ke salah satu daripada dua ruang yang tinggal. GC kecil juga menyemak objek dalam ruang yang terselamat dan mengalihkannya ke ruang mangsa yang lain (seterusnya).

Mari kita ambil urutan berikut sebagai contoh.

  1. Terdapat objek kedua-dua jenis (hidup dan mati) di Eden.
  2. GC kecil berlaku - semua objek mati dikeluarkan dari Eden. Semua objek hidup dialihkan ke ruang-1 (DariSpace). Eden dan ruang-2 kini kosong.
  3. Objek baru dicipta dan ditambahkan pada Eden. Beberapa objek di Eden dan ruang-1 menjadi mati.
  4. GC kecil berlaku - semua objek mati dikeluarkan dari Eden dan ruang-1. Semua objek hidup dialihkan ke ruang-2 (ToSpace). Eden dan ruang-1 kosong.

Oleh itu, pada bila-bila masa, salah satu ruang yang terselamat sentiasa kosong. Apabila mangsa yang terselamat mencapai ambang tertentu untuk bergerak melalui ruang yang terselamat, mereka mara ke generasi yang lebih tua.

Anda boleh menggunakan bendera -Xmn untuk menetapkan saiz generasi muda .

Generasi yang lebih tua

Objek yang hidup dalam jumlah masa yang besar (contohnya, kebanyakan jangka hayat program) akhirnya menjadi objek yang lebih tua - berusia seratus tahun. Ia juga dikenali sebagai generasi biasa dan mengandungi objek yang telah lama ditinggalkan di Survivor Spaces.

Ambang seumur hidup objek menentukan berapa banyak kitaran kutipan sampah yang mesti dilalui sebelum ia dipindahkan ke generasi lama. Proses apabila objek dihantar ke sampah dari generasi lama dipanggil acara pengumpulan sampah utama.

Anda boleh menggunakan bendera -Xms dan -Xmx untuk menetapkan saiz memori timbunan awal dan maksimum .

Oleh kerana Java menggunakan pengumpulan sampah generasi, semakin banyak peristiwa pengumpulan sampah yang dialami objek, semakin jauh ia bergerak pada timbunan. Dia bermula dalam generasi muda dan akhirnya berakhir dalam generasi biasa jika dia hidup cukup lama.

Untuk memahami promosi objek antara ruang dan generasi, pertimbangkan contoh berikut:

Apabila objek dicipta, ia pertama kali diletakkan di ruang Eden generasi muda.

Sebaik sahaja pengumpulan sampah kecil berlaku, objek hidup dari Eden dipindahkan ke FromSpace. Apabila kutipan sampah kecil seterusnya berlaku, objek hidup dari Eden dan angkasa dipindahkan ke ToSpace.

Kitaran ini berterusan beberapa kali. Jika objek masih "dalam perkhidmatan" selepas titik ini, kitaran kutipan sampah seterusnya akan mengalihkannya ke ruang generasi lama.

Generasi kekal dan metaspace

Metadata seperti kelas dan kaedah disimpan dalam penjanaan berterusan. JVM mengisinya pada masa jalan berdasarkan kelas yang digunakan oleh aplikasi. Kelas yang tidak digunakan lagi boleh bertukar dari generasi kekal kepada sampah.

Anda boleh menggunakan bendera -XX:PermGen dan -XX:MaxPermGen untuk menetapkan saiz awal dan maksimum generasi kekal .

ruang meta

Sejak Java 8, ruang PermGen telah digantikan dengan ruang memori MetaSpace. Pelaksanaannya berbeza daripada PermGen - ruang timbunan ini kini ditukar secara automatik.

Ini mengelakkan masalah kehabisan ingatan aplikasi yang berlaku disebabkan oleh saiz ruang timbunan PermGen yang terhad. Memori metaspace boleh dikumpul sampah, dan kelas yang tidak lagi digunakan akan dibersihkan secara automatik apabila metaspace mencapai saiz maksimumnya.