Memahami mekanisme pengumpulan sampah Java
Sebelum bercakap tentang set memori dan senarai kad, izinkan saya memperkenalkan kepada anda terlebih dahulu isu rujukan generasi silang.
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]; }
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
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.
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!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Panduan Nombor Sempurna di Jawa. Di sini kita membincangkan Definisi, Bagaimana untuk menyemak nombor Perfect dalam Java?, contoh dengan pelaksanaan kod.

Panduan untuk Penjana Nombor Rawak di Jawa. Di sini kita membincangkan Fungsi dalam Java dengan contoh dan dua Penjana berbeza dengan contoh lain.

Panduan untuk Weka di Jawa. Di sini kita membincangkan Pengenalan, cara menggunakan weka java, jenis platform, dan kelebihan dengan contoh.

Panduan untuk Nombor Smith di Jawa. Di sini kita membincangkan Definisi, Bagaimana untuk menyemak nombor smith di Jawa? contoh dengan pelaksanaan kod.

Dalam artikel ini, kami telah menyimpan Soalan Temuduga Spring Java yang paling banyak ditanya dengan jawapan terperinci mereka. Supaya anda boleh memecahkan temuduga.

Java 8 memperkenalkan API Stream, menyediakan cara yang kuat dan ekspresif untuk memproses koleksi data. Walau bagaimanapun, soalan biasa apabila menggunakan aliran adalah: bagaimana untuk memecahkan atau kembali dari operasi foreach? Gelung tradisional membolehkan gangguan awal atau pulangan, tetapi kaedah Foreach Stream tidak menyokong secara langsung kaedah ini. Artikel ini akan menerangkan sebab -sebab dan meneroka kaedah alternatif untuk melaksanakan penamatan pramatang dalam sistem pemprosesan aliran. Bacaan Lanjut: Penambahbaikan API Java Stream Memahami aliran aliran Kaedah Foreach adalah operasi terminal yang melakukan satu operasi pada setiap elemen dalam aliran. Niat reka bentuknya adalah

Panduan untuk TimeStamp to Date di Java. Di sini kita juga membincangkan pengenalan dan cara menukar cap waktu kepada tarikh dalam java bersama-sama dengan contoh.

Kapsul adalah angka geometri tiga dimensi, terdiri daripada silinder dan hemisfera di kedua-dua hujungnya. Jumlah kapsul boleh dikira dengan menambahkan isipadu silinder dan jumlah hemisfera di kedua -dua hujungnya. Tutorial ini akan membincangkan cara mengira jumlah kapsul yang diberikan dalam Java menggunakan kaedah yang berbeza. Formula volum kapsul Formula untuk jumlah kapsul adalah seperti berikut: Kelantangan kapsul = isipadu isipadu silinder Dua jumlah hemisfera dalam, R: Radius hemisfera. H: Ketinggian silinder (tidak termasuk hemisfera). Contoh 1 masukkan Jejari = 5 unit Ketinggian = 10 unit Output Jilid = 1570.8 Unit padu menjelaskan Kirakan kelantangan menggunakan formula: Kelantangan = π × r2 × h (4
