Rumah > Java > javaTutorial > Memahami mekanisme pengumpulan sampah Java

Memahami mekanisme pengumpulan sampah Java

WBOY
Lepaskan: 2023-04-24 14:10:07
ke hadapan
1007 orang telah melayarinya

Sebelum bercakap tentang set memori dan senarai kad, izinkan saya memperkenalkan kepada anda terlebih dahulu isu rujukan generasi silang.

Memahami mekanisme pengumpulan sampah Java

Jika anda ingin melaksanakan koleksi (Minor GC) yang terhad kepada kawasan generasi baharu, tetapi objek contoh 1 generasi baharu dirujuk dalam generasi lama , untuk mencari Untuk mengalih keluar semua objek yang masih hidup di kawasan ini (generasi baharu), sebagai tambahan kepada GC Roots tetap, semua objek dalam keseluruhan generasi lama perlu dilalui tambahan untuk memastikan ketepatan keputusan analisis kebolehcapaian, dan sebaliknya sebaliknya. Walaupun penyelesaian melintasi semua objek dalam keseluruhan generasi lama secara teorinya boleh dilaksanakan, ia sudah pasti akan membawa beban prestasi yang besar kepada kitar semula ingatan.

Malah, masalah rujukan silang generasi bukan sahaja antara generasi baru dan generasi lama, tetapi juga semua pemungut sampah yang melibatkan tingkah laku pengumpulan kawasan separa (Partial GC), seperti G1, ZGC dan Shenandoah koleksi. Semua peranti akan menghadapi masalah yang sama.

Jadi bagaimana kita boleh menyelesaikan rujukan generasi silang?

Pertama sekali, petikan silang generasi menyumbang hanya bilangan yang sangat kecil berbanding petikan generasi yang sama. Sebabnya ialah objek yang dirujuk merentas generasi harus cenderung untuk terus hidup atau mati pada masa yang sama (contohnya: jika objek generasi baharu mempunyai rujukan generasi silang, kerana objek generasi lama sukar untuk mati, rujukan ini akan membenarkan objek baharu objek generasi untuk dikumpul apabila ia dikumpulkan, dan kemudian dinaikkan pangkat kepada generasi lama apabila ia meningkat, pada masa itu rujukan generasi silang turut dihapuskan).

Mengikut apa yang diperkatakan di atas, tidak perlu mengimbas keseluruhan generasi lama untuk sejumlah kecil rujukan generasi silang Tidak perlu membazir ruang untuk merekodkan sama ada setiap objek wujud dan yang mana silang. rujukan generasi wujud. Anda hanya perlu mengimbas keseluruhan generasi lama untuk mendapatkan sebilangan kecil rujukan generasi silang. Cipta struktur data global (struktur ini dipanggil "Set Teringat"). dan mengenal pasti cebisan ingatan dalam generasi lama yang akan mempunyai rujukan generasi silang. Selepas itu, apabila Minor GC berlaku, hanya objek dalam blok kecil memori yang mengandungi rujukan rentas generasi akan ditambahkan pada GCRoots untuk pengimbasan. Walaupun kaedah ini perlu mengekalkan ketepatan data yang direkodkan apabila objek menukar hubungan rujukannya (seperti menetapkan dirinya sendiri atau atribut tertentu), yang akan meningkatkan beberapa overhed masa jalan, ia masih lebih menjimatkan kos daripada mengimbas keseluruhan generasi lama semasa pengumpulan.

Berikut ialah pengenalan kepada set memori struktur data global ini.

Set memori

Set memori ialah struktur data abstrak yang digunakan untuk merekodkan koleksi penunjuk dari kawasan bukan pengumpulan ke kawasan pengumpulan. Jika kami tidak mengambil kira kecekapan dan kos, pelaksanaan yang paling mudah boleh menggunakan semua tatasusunan objek yang mengandungi rujukan generasi silang dalam kawasan bukan pengumpulan untuk melaksanakan struktur data ini, seperti yang ditunjukkan dalam kod berikut:

//以对象指针来实现记忆集的伪代码
Class RememberedSet {
	Object[] set[OBJECT_INTERGENERATIONAL_REFERENCE_SIZE]; 
}
Salin selepas log masuk

Rakaman semua pelaksanaan yang mengandungi objek rujukan generasi silang ini agak mahal dari segi penggunaan ruang dan kos penyelenggaraan. Dalam senario kutipan sampah, pemungut hanya perlu menggunakan set memori untuk menentukan sama ada kawasan bukan kutipan tertentu mempunyai penunjuk yang menghala ke kawasan kutipan Ia tidak perlu mengetahui semua butiran penunjuk generasi silang ini. Apabila pereka bentuk melaksanakan set memori, mereka boleh memilih butiran rekod yang lebih kasar untuk menjimatkan kos penyimpanan dan penyelenggaraan set memori. Berikut menyenaraikan beberapa ketepatan rekod untuk pemilihan (sudah tentu anda juga boleh memilih di luar julat ini):

  • Ketepatan panjang perkataan: Setiap rekod adalah tepat kepada satu panjang perkataan mesin (iaitu, pemproses Bilangan bit pengalamatan, seperti 32-bit atau 64-bit biasa, ketepatan ini menentukan panjang penuding yang digunakan oleh mesin untuk mengakses alamat memori fizikal), perkataan ini mengandungi penuding silang generasi.

  • Ketepatan objek: Setiap rekod adalah tepat kepada objek dan terdapat medan dalam objek yang mengandungi penuding generasi silang.

  • Ketepatan kad: Setiap rekod adalah tepat pada kawasan ingatan dan terdapat objek dalam kawasan ini yang mengandungi penunjuk generasi silang.

Di atas, jenis ketiga "ketepatan kad" merujuk kepada penggunaan kaedah yang dipanggil "jadual kad" untuk melaksanakan set memori, yang pada masa ini merupakan pelaksanaan yang paling biasa digunakan bagi set ingatan.

Apakah hubungan antara senarai kad dan set memori?

Apabila saya memperkenalkan set memori sebelum ini, saya menyatakan bahawa set memori sebenarnya adalah struktur data "abstrak" bermakna ia hanya mentakrifkan niat tingkah laku set memori dan tidak menentukan pelaksanaan khusus kelakuannya. Jadual kad ialah pelaksanaan khusus set memori, yang mentakrifkan ketepatan rakaman set memori, hubungan pemetaan dengan memori timbunan, dsb. Mengenai hubungan antara set memori dan jadual kad, ia boleh difahami dengan analogi dengan hubungan antara Map dan HashMap dalam Java (iaitu, hubungan antara antara muka dan kelas pelaksanaan).

Mari kita bincangkan tentang pelaksanaan khusus set memori secara terperinci

Jadual kad

Jadual kad dilaksanakan menggunakan tatasusunan bait CARD_TABLE[]. sepadan dengan kawasan memori yang dikenal pasti ialah blok memori dengan saiz tertentu Setiap blok memori dipanggil halaman kad. Seperti yang ditunjukkan dalam rajah di bawah

Memahami mekanisme pengumpulan sampah Java

Dengan cara ini kita boleh membahagikan kawasan tertentu mengikut muka surat kad Jika kita sekarang ingin mengutip sampah kawasan generasi baru, maka kita boleh Kawasan era dibahagikan kepada halaman kad satu demi satu, seperti yang ditunjukkan dalam rajah di bawah.

Memahami mekanisme pengumpulan sampah Java

Seperti yang ditunjukkan dalam rajah, kerana terdapat rujukan generasi silang yang menunjuk kepada generasi baharu dalam kadpage1, kedudukan pertama jadual kad yang sepadan ialah 1, menunjukkan bahawa terdapat aplikasi generasi silang dalam objek kawasan halaman ini.

  • Sudut jadual kad: Oleh kerana terdapat objek minuman generasi silang di halaman1, kedudukan pertama yang sepadan dengan jadual kad direkodkan sebagai 1, menunjukkan bahawa elemen halaman1 adalah kotor.

  • Sudut kitar semula memori: Oleh kerana kedudukan pertama jadual kad ialah 1, ia menunjukkan bahawa terdapat objek aplikasi generasi silang dalam kawasan halaman, dan kawasan ini perlu diimbas semasa kutipan sampah.

Memori halaman kad biasanya mengandungi lebih daripada satu objek Selagi terdapat penuding generasi silang dalam medan satu (atau lebih) objek dalam halaman kad, jadual kad yang sepadan akan menjadi Nilai elemen tatasusunan ditandakan sebagai 1, yang bermaksud elemen itu kotor (Kotor), jika tidak, ia ditandakan sebagai 0. Apabila kutipan sampah berlaku, selagi unsur-unsur kotor dalam jadual kad ditapis, anda boleh mengetahui dengan mudah blok memori halaman kad yang mengandungi penuding generasi silang, dan menambahkannya pada GC Roots dan mengimbasnya bersama-sama. Ini menghapuskan keperluan untuk mengimbas keseluruhan generasi lama dan sangat mengurangkan julat pengimbasan GC Roots.

Atas ialah kandungan terperinci Memahami mekanisme pengumpulan sampah Java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:yisu.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan