JavaRush /Blog Java /Random-MS /Coffee break #210. Semua Jenis Pengumpul Sampah di Jawa Y...

Coffee break #210. Semua Jenis Pengumpul Sampah di Jawa Yang Perlu Anda Ketahui

Diterbitkan dalam kumpulan
Sumber: Hackernoon Melalui siaran ini, anda akan mempelajari kekuatan dan kelemahan setiap jenis pengumpul sampah yang digunakan dalam pembangunan Java. Coffee break #210.  Semua Jenis Pengumpul Sampah di Jawa Yang Perlu Anda Ketahui - 1Persoalan mengenai Pemungut Sampah (GC) boleh didengari dalam hampir setiap temu bual. Jadi saya memutuskan untuk mengumpul semua maklumat yang diperlukan tentang mereka menggunakan prinsip kegemaran saya - pendek dan mudah. Mula-mula, mari kita mulakan dengan tujuan CG dan mengapa kita memerlukan pelbagai jenis pengumpul sampah. Dalam bahasa seperti C, kita perlu menyimpan maklumat objek dalam ingatan dan menulis banyak kod boilerplate untuk membebaskan memori itu. Sudah tentu, kebocoran memori adalah perkara biasa dalam program sedemikian. Java menyelesaikan masalah kebocoran memori menggunakan pengumpul sampah. Dan anda, sebagai pemaju, harus tahu pemungut sampah yang terbaik untuk digunakan. Banyak bergantung pada di mana dan bagaimana program anda berjalan. Ia mungkin berjalan pada perkakasan yang lemah atau dengan sejumlah besar objek, atau program anda mestilah sangat pantas. Berdasarkan syarat ini, anda harus menala pengumpul sampah anda untuk mencapai prestasi yang diingini. Jadi, mari kita mulakan.

Bagaimana JVM berurusan dengan ingatan

Java Virtual Machine (JVM) membahagikan memori kepada dua kawasan: heap, yang menyimpan data aplikasi, dan non-heap, yang menyimpan kod program dan data lain. Mari kita alihkan perhatian kita ke kawasan timbunan. Di sinilah program kami mencipta objek baharu. Semua pengumpul sampah adalah berdasarkan fakta bahawa banyak program menggunakan objek fana. Iaitu, objek ini dicipta, kemudian memenuhi fungsinya dan tidak lagi diperlukan. Majoriti objek sedemikian. Tetapi sesetengah objek hidup lebih lama, mungkin juga untuk keseluruhan tempoh program. Di sinilah idea membahagikan objek kepada generasi muda dan tua timbul. Dan kita perlu menyemak generasi muda dengan kerap. Hakikatnya ialah proses pengumpulan sampah dibahagikan kepada pembersihan kecil, yang hanya memberi kesan kepada generasi muda, dan pembersihan lengkap, yang boleh menjejaskan kedua-dua generasi. Ingat bahawa pengutip sampah adalah program. Dan ia memerlukan masa dan sumber daripada komputer anda untuk berfungsi. Yang juga mempengaruhi permohonan kami. Bagaimana ia memberi kesan? Sebagai contoh, untuk melaksanakan kutipan sampah, JVM menjeda aplikasi kami. Ini dipanggil jeda Stop-The-World (STW). Pada masa ini, semua urutan permohonan digantung. Tetapi aplikasi di dalamnya sama sekali tidak menyedari perkara ini. Untuk aplikasi, masa mengalir sama rata. Mengapa ini sangat teruk? Bayangkan, anda sedang menulis sejenis aplikasi pertukaran atau permohonan untuk autopilot kapal terbang. Permohonan anda boleh tidur selama satu saat, dan sifat masalah anda boleh berubah secara mendadak. Iaitu, jeda ialah parameter penting bagi setiap pemungut sampah. Harta asas pemungut sampah seterusnya ialah jumlah masa yang dibelanjakan untuk mengutip sampah berhubung dengan jumlah masa pelaksanaan program. Apakah maksud ini dan mengapa ia begitu penting? Daripada satu fasa "Stop-The-World" yang besar, kita boleh memilih algoritma dengan banyak jeda kecil. Rehat kecil adalah lebih baik, tetapi tiada apa yang datang secara percuma. Dalam kes ini, kami membayar dengan meningkatkan jumlah masa pelaksanaan program. Dan kita mesti mengambil kira ini juga. Parameter seterusnya ialah jumlah sumber perkakasan. Setiap pengumpul memerlukan memori untuk menyimpan maklumat objek dan pemproses untuk melakukan pembersihan. Parameter terakhir ialah kelajuan. Kecekapan kutipan sampah merujuk kepada seberapa cepat dan cekap pemungut sampah (GC) menuntut semula memori yang tidak lagi digunakan oleh program. Semua parameter ini mempengaruhi algoritma, yang boleh membebaskan memori secepat mungkin sambil menggunakan sumber yang minimum. Mari kita lihat pengutip sampah yang tersedia untuk kita. Untuk temuduga anda perlu tahu lima yang pertama. Dua yang lain jauh lebih sukar.

GC bersiri

Serial GC ialah pengumpul sampah Mesin Maya Java dan telah digunakan sejak permulaan Java. Ia berguna untuk program dengan timbunan kecil dan berjalan pada mesin yang kurang berkuasa. Pengumpul sampah ini membahagikan timbunan kepada kawasan, termasuk Eden dan Survivor. Rantau Eden ialah kumpulan dari mana memori untuk kebanyakan objek pada mulanya diperuntukkan. Survivor ialah kolam yang mengandungi objek yang terselamat daripada pengumpulan sampah di wilayah Eden. Apabila timbunan itu terisi, objek dialihkan antara kawasan Eden dan Survivor. JVM sentiasa memantau pergerakan objek ke dalam wilayah Survivor dan memilih ambang yang sesuai untuk bilangan pergerakan tersebut, selepas itu objek dipindahkan ke wilayah Bertenaga. Apabila tidak ada ruang yang mencukupi di rantau Tenured, kutipan sampah penuh mengambil alih, bekerja pada objek kedua-dua generasi. Kelebihan utama pemungut sampah ini adalah keperluan sumbernya yang rendah, jadi pemproses kuasa rendah sudah cukup untuk melakukan pengumpulan. Kelemahan utama Serial GC ialah jeda yang lama semasa pengumpulan sampah, terutamanya apabila melibatkan jumlah data yang besar.

CG selari

Pengumpul sampah selari (Parallel CG) adalah serupa dengan pembina berjujukan. Ia termasuk pemprosesan selari beberapa tugas dan keupayaan untuk menala tetapan prestasi secara automatik. GC Parallel ialah pengumpul sampah Mesin Maya Java berdasarkan idea GC Bersiri, tetapi dengan selari dan kecerdasan tambahan. Jika komputer mempunyai lebih daripada satu teras pemproses, versi lama JVM secara automatik memilih Parallel GC. Timbunan di sini dibahagikan kepada wilayah yang sama seperti dalam Serial GC - Eden, Survivor 0, Survivor 1 dan Old Gen (Tenured). Walau bagaimanapun, berbilang benang mengambil bahagian dalam kutipan sampah secara selari, dan pemungut boleh menyesuaikan diri dengan parameter prestasi yang diperlukan. Setiap benang pengumpul mempunyai kawasan memori yang perlu dikosongkan. GC Parallel juga mempunyai tetapan yang bertujuan untuk mencapai kecekapan pengumpulan sampah yang diperlukan. Pengumpul menggunakan statistik daripada kutipan sampah sebelumnya untuk menala tetapan prestasi untuk koleksi masa hadapan. GC selari menyediakan penalaan automatik parameter prestasi dan masa jeda binaan yang lebih rendah, tetapi terdapat satu kelemahan kecil dalam bentuk beberapa pemecahan memori. Ia sesuai untuk kebanyakan aplikasi, tetapi untuk program yang lebih kompleks adalah lebih baik untuk memilih pelaksanaan pemungut sampah yang lebih maju. Kelebihan: Lebih cepat daripada Serial GC dalam banyak kes. Mempunyai kelajuan yang baik. Keburukan: Menggunakan lebih banyak sumber dan jeda boleh menjadi agak lama, tetapi kami boleh melaraskan tempoh jeda maksimum Stop-The-World.

Sapuan Mark serentak

Pengumpul sampah Concurrent Mark Sweep (CMS) bertujuan untuk mengurangkan tempoh jeda maksimum dengan menjalankan beberapa tugas pengumpulan sampah serentak dengan utas aplikasi. Pengumpul sampah ini sesuai untuk menguruskan sejumlah besar data dalam ingatan. Concurrent Mark Sweep (CMS) ialah alternatif kepada Parallel GC dalam Java Virtual Machine (JVM). Ia bertujuan untuk aplikasi yang memerlukan akses kepada berbilang teras pemproses dan sensitif kepada jeda Stop-The-World. CMS melakukan langkah-langkah pengumpulan sampah selari dengan program utama, yang membolehkannya berjalan tanpa henti. Ia menggunakan organisasi memori yang sama seperti pengumpul Bersiri dan Selari, tetapi tidak menunggu kawasan Tenured diisi sebelum menjalankan pembersihan generasi lama. Sebaliknya, ia berjalan di latar belakang dan cuba memastikan rantau Tenured padat. Sapuan Tanda Serentak bermula dengan fasa penandaan awal yang menghentikan secara ringkas utas utama aplikasi dan menandakan semua objek boleh diakses daripada akar. Urutan utama aplikasi kemudian disambung semula dan CMS mula mencari semua objek aktif yang boleh diakses oleh pautan daripada objek akar yang ditanda. Selepas menandakan semua objek hidup, pengumpul membersihkan ingatan objek mati dalam beberapa benang selari. Salah satu faedah CMS ialah tumpuannya untuk meminimumkan masa henti, yang penting untuk banyak aplikasi. Walau bagaimanapun, ia memerlukan pengorbanan dari segi sumber CPU dan lebar jalur keseluruhan. Di samping itu, CMS tidak memampatkan objek dalam generasi lama, yang membawa kepada pemecahan. Jeda lama disebabkan kemungkinan kegagalan mod selari boleh menjadi kejutan yang tidak menyenangkan (walaupun ia tidak kerap berlaku). Jika terdapat memori yang mencukupi, CMS boleh mengelakkan jeda sedemikian. Kelebihan: Cepat. Mempunyai jeda Stop-The-World yang kecil. Keburukan: menggunakan lebih banyak ingatan; jika ingatan tidak mencukupi, beberapa jeda mungkin lama. Tidak begitu baik jika aplikasi mencipta banyak objek.

Sampah-Didahulukan

Garbage-First (G1) dianggap sebagai alternatif kepada CMS, terutamanya untuk aplikasi pelayan yang dijalankan pada pelayan berbilang pemproses dan menguruskan set data yang besar. Pengumpul sampah G1 menukarkan memori kepada berbilang kawasan yang sama saiz, kecuali kawasan besar (yang dicipta dengan menggabungkan kawasan biasa untuk menampung objek besar). Wilayah tidak perlu disusun secara berturut-turut dan boleh menukar gabungan generasi mereka. Pembersihan kecil dilakukan secara berkala untuk generasi muda dan memindahkan objek ke wilayah Survivor atau menaik tarafnya kepada generasi yang lebih tua dan memindahkannya ke Tenured. Pembersihan dijalankan hanya di kawasan-kawasan yang perlu untuk mengelakkan daripada melebihi masa yang dikehendaki. Pengumpul sendiri meramalkan dan memilih kawasan dengan jumlah sampah terbesar untuk dibersihkan. Sapuan penuh menggunakan gelung penandaan untuk membuat senarai objek langsung yang berjalan selari dengan aplikasi utama. Selepas kitaran penandaan, G1 beralih kepada menjalankan pembersihan bercampur, yang menambahkan wilayah generasi lama kepada set wilayah generasi muda yang akan dibersihkan. Pengumpul sampah G1 dianggap lebih tepat daripada pengumpul CMS dalam meramalkan saiz jeda dan mengagihkan kutipan sampah dengan lebih baik dari semasa ke semasa untuk mengelakkan masa henti aplikasi yang lama, terutamanya dengan saiz timbunan yang besar. Ia juga tidak memecah memori seperti pengumpul CMS. Walau bagaimanapun, pengumpul G1 memerlukan lebih banyak sumber CPU untuk dijalankan selari dengan program utama, yang mengurangkan daya pemprosesan aplikasi. Kelebihan: Berfungsi lebih baik daripada CMS. Mempunyai jeda yang lebih pendek. Keburukan: Menggunakan lebih banyak sumber CPU. Ia juga menggunakan lebih banyak memori jika kita mempunyai banyak objek yang agak besar (lebih daripada 500 KB) kerana ia meletakkan objek tersebut dalam satu rantau (1-32 MB).

Epsilon GC

Epsilon GC direka untuk situasi di mana pengumpulan sampah tidak diperlukan. Ia tidak melakukan kutipan sampah, tetapi menggunakan TLAB (penampan peruntukan setempat-benang) untuk memperuntukkan objek baharu - penimbal memori kecil yang diminta oleh benang individu daripada timbunan. Objek besar yang tidak sesuai dengan blok memori permintaan penimbal khusus untuk diri mereka sendiri. Apabila Epsilon GC kehabisan sumber, OutOfMemoryError dijana dan prosesnya ditamatkan. Faedah Epsilon GC termasuk keperluan sumber yang lebih rendah dan peruntukan memori yang lebih pantas untuk aplikasi yang mencipta semua objek yang mereka perlukan semasa permulaan atau menjalankan aplikasi jangka pendek yang tidak menggunakan semua memori yang diperuntukkan. Epsilon GC juga boleh membantu menganalisis keperluan sumber yang ditambahkan oleh pengumpul sampah lain pada aplikasi anda. Kelebihan: Sangat pantas. Kekurangan: Tidak mengosongkan objek :) Dua pengumpul seterusnya adalah yang paling maju dari jenis mereka, tetapi juga yang paling kompleks. Oleh itu, kami akan mempertimbangkannya secara ringkas.

ZGC

ZGC boleh mengekalkan kependaman sub-milisaat walaupun semasa berurusan dengan sejumlah besar data. ZGC ialah pemungut sampah yang dibangunkan oleh Oracle untuk Java yang direka untuk memberikan daya pemprosesan yang tinggi dan kependaman rendah apabila memproses timbunan besar (sehingga 16 TB). ZGC adalah berdasarkan prinsip ingatan maya dan menggunakan tanda warna yang berbeza untuk menjejaki keadaan objek semasa pengumpulan sampah. Kelebihan: Jeda kurang daripada satu milisaat, walaupun pada timbunan besar, yang sangat berguna untuk aplikasi yang memerlukan masa pemprosesan pertanyaan yang singkat. Ia berfungsi dengan timbunan yang sangat besar dengan daya pemprosesan yang baik. ZGC boleh memampatkan memori timbunan semasa pengumpulan sampah. Kekurangan: Penggunaan CPU yang tinggi dan keperluan prestasi yang ketara, yang boleh melambatkan masa pelancaran aplikasi.

Shenandoah G.C.

Shenandoah GC ialah pemungut sampah lain dengan jeda singkat tanpa mengira saiz timbunan. Pengumpul sampah ini dibangunkan oleh Red Hat. Ia direka untuk meminimumkan masa yang dibelanjakan oleh aplikasi untuk pengumpulan sampah. Seperti ZGC, ia adalah pengumpul selari, yang bermaksud ia berjalan semasa aplikasi berjalan, meminimumkan jeda. Shenandoah GC menggunakan "penunjuk pemajuan" untuk mengalihkan objek semasa pengumpulan sampah. Ia juga mempunyai teknik yang dipanggil "penyingkiran halangan beban" untuk meningkatkan prestasi. Kelebihan: Shenandoah GC boleh mencapai masa jeda yang singkat, selalunya kurang daripada 10ms, walaupun untuk timbunan besar. Daya pengeluaran yang baik. Kekurangan: beban pemproses yang tinggi dan kesukaran bekerja di bawah beban berat.

Kesimpulan

Pengumpul sampah adalah salah satu tugas yang paling sukar dalam pengaturcaraan. Perkembangan baru sentiasa dijalankan ke arah ini. Walaupun jarang sekali bagi pengaturcara untuk mengubah suai GC, anda masih perlu mempunyai sekurang-kurangnya pengetahuan tentang cara alat kutipan sampah anda berfungsi.
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION