- Apa itu pengumpulan sampah otomatis?
- Langkah 1: Tandai
- Langkah 2: Hapus
- kompresi
- Mengapa kita membutuhkan pengumpulan sampah generasi?
- Generasi JVM
- Proses pengumpulan sampah generasi
Apa itu pengumpulan sampah otomatis?
Pengumpulan sampah otomatis adalah mekanisme untuk mengetahui objek mana yang sedang digunakan dan objek mana yang tidak digunakan dalam memori heap, dan menghapus yang terakhir.
Objek yang disebut dalam penggunaan (objek yang direferensikan) mengacu pada objek yang ditunjuk oleh pointer dalam program; sedangkan objek yang tidak digunakan (objek yang tidak direferensikan) tidak ditunjukkan oleh pointer mana pun, sehingga memori yang ditempati juga dapat didaur ulang Penurunan.
Saat menggunakan bahasa pemrograman seperti C, pemrogram perlu mengalokasikan dan melepaskan memori secara manual. Java berbeda, ia memiliki pengumpul sampah, dan pengumpul bertanggung jawab untuk melepaskan memori. Artikel ini kemudian akan memperkenalkan proses dasar dari mekanisme pengumpulan sampah.
Langkah 1: Tandai
Langkah pertama dalam pengumpulan sampah adalah menandai. Pengumpul sampah akan mengetahui memori mana yang digunakan dan mana yang tidak.
Pada gambar di atas, biru berarti objek telah direferensikan, dan oranye berarti objek tersebut belum direferensikan. Pengumpul sampah harus memeriksa semua objek untuk mengetahui mana yang direferensikan dan mana yang tidak. Jika semua objek dalam sistem harus diperiksa, langkah ini mungkin cukup memakan waktu. Ikuti akun resmi WeChat dari tumpukan teknologi Java, balas: JVM46, Anda bisa mendapatkan panduan penyetelan JVM yang sangat lengkap.
Langkah 2: Hapus
Langkah ini akan menghapus objek yang ditandai tidak direferensikan.
Pengalokasi memori menyimpan referensi ke memori yang tersedia untuk mengalokasikan objek baru.
kompresi
Untuk meningkatkan kinerja, setelah menghapus objek yang tidak direferensikan, Anda juga dapat menggabungkan objek referensi yang tersisa (kompres), sehingga objek baru dapat dialokasikan dengan lebih mudah dan cepat.
Mengapa kita membutuhkan pengumpulan sampah generasi?
Seperti yang disebutkan sebelumnya, menandai dan mengompresi semua objek di mesin virtual Java satu per satu sangat tidak efisien: semakin banyak objek dialokasikan, semakin lama waktu yang dibutuhkan untuk pengumpulan sampah. Namun, menurut statistik, kebanyakan objek tidak akan berguna untuk waktu yang lama.
Mari kita lihat contohnya. (Pada gambar di bawah ini, sumbu vertikal mewakili byte yang dialokasikan, dan sumbu horizontal mewakili waktu berjalan program)
Seperti yang dapat dilihat dari gambar di atas, jumlah objek yang masih hidup (tidak dilepaskan) berkurang dengan berjalannya waktu. Puncak di sisi kiri gambar juga menunjukkan bahwa sebagian besar subjek sebenarnya berumur pendek.
Generasi JVM
Menurut aturan sebelumnya, ini dapat digunakan untuk meningkatkan efisiensi JVM. Caranya dengan membagi heap menjadi beberapa bagian (yang disebut generasi), yaitu generasi muda, generasi tua, dan generasi abadi.
Objek baru akan dialokasikan dalam memori generasi muda. Setelah memori generasi baru penuh, memori tersebut akan memulai apa yang disebut proses pengumpulan sampah kecil untuk objek mati. Dalam sepotong memori generasi baru, semakin mati, semakin cepat proses pemulihannya; sedangkan untuk objek yang masih hidup, mereka akan menua saat ini dan akhirnya menjadi cukup tua untuk memasuki memori generasi lama.
Acara Hentikan Dunia-pengumpulan sampah kecil milik acara yang disebut "Hentikan Dunia". Saat peristiwa semacam ini terjadi, semua rangkaian program harus ditangguhkan hingga peristiwa tersebut selesai (misalnya, semua pekerjaan pemulihan selesai di sini).
Generasi tua digunakan untuk mengawetkan benda berumur panjang. Biasanya ada ambang batas yang ditetapkan, dan ketika usianya telah tercapai, objek generasi muda akan dipindahkan ke generasi tua. Lama kelamaan generasi tua juga akan didaur ulang. Acara ini menjadi Major GC.
GC Mayor juga akan memicu STW (Stop the World). Umumnya, Major GC jauh lebih lambat karena melibatkan semua objek hidup. Oleh karena itu, untuk aplikasi yang responsif, Major GC harus dihindari sebisa mungkin. Perhatikan juga bahwa durasi STW Major GC dipengaruhi oleh jenis pengumpul sampah generasi lama.
Generasi permanen berisi metadata yang digunakan oleh JVM untuk mendeskripsikan kelas dan metode dalam aplikasi. Generasi permanen diisi oleh JVM saat runtime sesuai dengan kelas yang digunakan oleh aplikasi. Selain itu, pustaka dan metode kelas Java SE juga disimpan di sini.
Jika JVM menemukan bahwa kelas tertentu tidak lagi diperlukan, dan kelas lain mungkin memerlukan ruang, kelas ini dapat diklaim ulang.
Proses pengumpulan sampah generasi
Sekarang Anda telah memahami mengapa heap dibagi menjadi beberapa generasi, sekarang saatnya untuk melihat bagaimana ruang-ruang ini berinteraksi. Gambar berikut akan memperkenalkan alokasi objek dan proses penuaan di JVM.
Pertama, alokasikan objek baru ke ruang eden. Kedua ruang penyintas kosong.
Saat ruang eden terisi, sedikit pengumpulan sampah dipicu.
Objek yang direferensikan dipindahkan ke ruang survivor pertama. Ketika ruang eden dikosongkan, objek yang tidak direferensikan akan dihapus.
Di Minor GC berikutnya, area Eden akan melakukan hal yang sama. Hapus objek yang tidak direferensikan dan pindahkan objek yang direferensikan ke area Survivor. Namun di sini, mereka dipindahkan ke area Survivor kedua (S1).
Selain itu, di area Survivor pertama (S0), objek yang selamat dari Minor GC terakhir akan bertambah umurnya dan dipindahkan ke S1. Setelah semua objek yang masih hidup dipindahkan ke area S1, S0 dan Eden akan dibersihkan. Perhatikan bahwa ada objek dari berbagai usia di area Survivor.
Di GC Minor berikutnya, operasi yang sama akan diulangi. Namun, kali ini zona Survivor akan ditukar. Objek yang direferensikan dipindahkan ke S0 ,. Benda-benda yang masih hidup bertambah umur. Area Eden dan S1 dibersihkan.
Slide ini menunjukkan promosi. Setelah GC yang lebih kecil, ketika objek yang menua mencapai ambang usia tertentu (8 dalam contoh ini), mereka dipromosikan dari generasi muda ke generasi tua.
Karena GC yang lebih kecil terus terjadi, objek akan terus diperluas ke ruang generasi lama.
Jadi ini hampir mencakup seluruh proses generasi muda. Pada akhirnya, GC akan dilakukan terutama pada generasi lama untuk membersihkan dan akhirnya memampatkan ruang.
Sumber::-D Telusuri ID WeChat (ID: Kode sumber talas ), Anda bisa mendapatkan berbagai analisis kode sumber Java, penjelasan prinsip, pertanyaan wawancara, dan panduan belajar.
:-D Dan, balas [ buku Setelah itu, Anda bisa mendapatkan 100 buku tentang Java mulai dari entri hingga arsitektur yang direkomendasikan oleh penulis.
:-D Dan, balas [ Grup Teknologi ] Setelah itu, Anda dapat bergabung dengan grup teknologi yang berdedikasi untuk membahas Java, back-end, dan arsitektur.
Ayolah, Sao Nian ~
- Menjelaskan gembok terdistribusi secara umum, dan penulis rugi jika tidak mengerti setelah membacanya
- Mengapa perusahaan besar hanya merekrut 211 mahasiswa? Bukan kemampuan dan pendidikan, staf internal memberi jawaban
- Bintang NBA pertama yang dicegat oleh polisi lalu lintas Tiongkok! Harden: Saya hanya ingin melihat pemandangan
- "Ide Kreatif" OCT Group untuk Pengentasan Kemiskinan-Sebuah "Bunga Merah Kecil" yang membawa senyum kepada anak-anak di daerah pegunungan
- Membawa warisan budaya takbenda lebih dekat kepada Anda: bahu-membahu mengajarkan produksi bayi yang menggemaskan
- Menanggapi fluktuasi secara rasional. Tidak disarankan untuk membesar-besarkan efek pengambilan darah baru secara membabi buta pada dewan inovasi sains dan teknologi.