JavaRush /Blog Jawa /Random-JV /Ngopi #210. Kabeh Jinis Pengumpul Sampah ing Jawa Sampeya...

Ngopi #210. Kabeh Jinis Pengumpul Sampah ing Jawa Sampeyan Kudu Ngerti

Diterbitake ing grup
Sumber: Hackernoon Liwat kiriman iki, sampeyan bakal sinau babagan kekuwatan lan kelemahane saben jinis pengumpul sampah sing digunakake ing pangembangan Jawa. Ngopi #210.  Kabeh Jinis Pengumpul Sampah ing Jawa Sampeyan Kudu Ngerti - 1Pitakonan babagan Garbage Collector (GC) bisa dirungokake ing meh saben wawancara. Dadi aku mutusake kanggo ngumpulake kabeh informasi sing dibutuhake babagan nggunakake prinsip favoritku - cendhak lan prasaja. Pisanan, ayo miwiti kanthi tujuan CG lan kenapa kita butuh macem-macem jinis kolektor sampah. Ing basa kaya C, kita kudu nyimpen informasi obyek ing memori lan nulis akeh kode boilerplate kanggo mbebasake memori kasebut. Mesthine, bocor memori umume ing program kasebut. Jawa ngatasi masalah bocor memori nggunakake tukang sampah. Lan sampeyan, minangka pangembang, kudu ngerti manawa tukang sampah sing paling apik digunakake. Akeh gumantung ing ngendi lan carane program sampeyan mlaku. Bisa mlaku ing hardware sing ringkih utawa kanthi obyek sing akeh, utawa program sampeyan kudu cepet banget. Adhedhasar kahanan kasebut, sampeyan kudu nyetel pengumpul sampah kanggo entuk kinerja sing dikarepake. Dadi, ayo miwiti.

Carane JVM urusan karo memori

Java Virtual Machine (JVM) mbagi memori dadi rong area: heap, sing nyimpen data aplikasi, lan non-heap, sing nyimpen kode program lan data liyane. Ayo dadi fokus ing area tumpukan. Iki ngendi program kita nggawe obyek anyar. Kabeh kolektor sampah adhedhasar kasunyatan manawa akeh program nggunakake obyek ephemeral. Tegese, obyek kasebut digawe, banjur nindakake fungsine lan ora dibutuhake maneh. Mayoritas obyek kasebut. Nanging sawetara obyek urip luwih suwe, bisa uga kanggo kabeh durasi program. Ing kene muncul ide kanggo mbagi obyek dadi generasi enom lan tuwa. Lan kita kudu asring mriksa generasi enom. Kasunyatane yaiku proses pengumpulan sampah dipérang dadi reresik cilik, sing mung mengaruhi generasi enom, lan reresik lengkap, sing bisa mengaruhi loro generasi. Elinga yen tukang sampah minangka program. Lan mbutuhake wektu lan sumber daya saka komputer kanggo bisa. Sing uga mengaruhi aplikasi kita. Kepiye pengaruhe? Contone, kanggo nindakake pengumpulan sampah, JVM ngaso aplikasi kita. Iki diarani ngaso Stop-The-World (STW). Sajrone wektu iki, kabeh utas aplikasi ditundha. Nanging aplikasi ing njero ora ngerti babagan iki. Kanggo aplikasi, wektu mili merata. Apa iki dadi ala? Bayangake, sampeyan nulis sawetara jinis aplikasi ijol-ijolan utawa aplikasi kanggo autopilot pesawat. Aplikasi sampeyan bisa turu sedhela, lan sifat masalah sampeyan bisa owah banget. Yaiku, ngaso minangka parameter penting kanggo saben tukang sampah. Properti dhasar sabanjure kolektor sampah yaiku total wektu nglumpukake sampah ing hubungane karo total wektu eksekusi program. Apa tegese iki lan kenapa penting banget? Tinimbang siji fase "Stop-The-World" gedhe, kita bisa milih algoritma kanthi akeh jeda cilik. Istirahat cilik luwih disenengi, nanging ora ana sing gratis. Ing kasus iki, kita mbayar kanthi nambah total wektu eksekusi program. Lan kita uga kudu nganggep iki. Parameter sabanjure yaiku jumlah sumber daya hardware. Saben kolektor mbutuhake memori kanggo nyimpen informasi obyek lan prosesor kanggo nindakake reresik. Parameter pungkasan yaiku kacepetan. Efisiensi pengumpulan sampah nuduhake carane cepet lan efisien pengumpul sampah (GC) mbalekake memori sing ora digunakake maneh dening program. Kabeh paramèter iki mengaruhi algoritma, sing bisa mbebasake memori kanthi cepet nalika nggunakake sumber daya minimal. Ayo goleki para pengepul sampah sing kasedhiya kanggo kita. Kanggo wawancara sampeyan kudu ngerti limang pisanan. Loro liyane luwih angel.

Serial GC

Serial GC minangka pengumpul sampah Java Virtual Machine lan wis digunakake wiwit wiwitan Jawa. Iku migunani kanggo program karo tumpukan cilik lan mlaku ing mesin kurang kuat. Pengumpul sampah iki mbagi tumpukan kasebut dadi wilayah, kalebu Eden lan Survivor. Wilayah Eden minangka blumbang saka ngendi memori kanggo umume obyek wiwitane dialokasikan. Survivor minangka blumbang sing ngemot obyek sing slamet saka koleksi sampah ing wilayah Eden. Nalika tumpukan ngisi, obyek dipindhah ing antarane wilayah Eden lan Survivor. JVM terus-terusan ngawasi gerakan obyek menyang wilayah Survivor lan milih ambang sing cocog kanggo jumlah gerakan kasebut, sawise obyek kasebut dipindhah menyang wilayah Tenured. Nalika ora ana papan sing cukup ing wilayah Tenured, koleksi sampah lengkap njupuk alih, nggarap obyek saka rong generasi. Kauntungan utama saka kolektor sampah iki yaiku syarat sumber daya sing sithik, mula prosesor daya kurang cukup kanggo nindakake koleksi kasebut. Kerugian utama Serial GC yaiku ngaso dawa sajrone ngumpulake sampah, utamane nalika ana data sing akeh.

Paralel CG

Penagih sampah paralel (CG Paralel) padha karo konstruktor urut-urutan. Iki kalebu pangolahan paralel sawetara tugas lan kemampuan kanggo nyetel setelan kinerja kanthi otomatis. GC Paralel minangka kolektor sampah Java Virtual Machine adhedhasar gagasan Serial GC, nanging ditambahake paralelisme lan intelijen. Yen komputer duwe luwih saka siji inti prosesor, versi lawas saka JVM otomatis milih Parallel GC. Tumpukan ing kene dipérang dadi wilayah sing padha kaya ing Serial GC - Eden, Survivor 0, Survivor 1 lan Old Gen (Tenured). Nanging, macem-macem benang melu koleksi sampah kanthi podo karo, lan kolektor bisa nyetel paramèter kinerja sing dibutuhake. Saben benang kolektor duwe area memori sing kudu diresiki. GC Paralel uga duwe setelan sing ngarahake entuk efisiensi pengumpulan sampah sing dibutuhake. Penagih nggunakake statistik saka koleksi sampah sadurunge kanggo nyetel setelan kinerja kanggo koleksi mangsa ngarep. Parallel GC nyedhiyakake tuning otomatis paramèter kinerja lan wektu ngaso mbangun ngisor, nanging ana siji drawback suntingan ing wangun sawetara fragmentasi memori. Cocog kanggo umume aplikasi, nanging kanggo program sing luwih kompleks, luwih becik milih implementasi pengumpul sampah sing luwih maju. Pros: Luwih cepet saka Serial GC ing akeh kasus. Nduweni kacepetan apik. Cons: Nganggo sumber daya liyane lan ngaso bisa cukup dawa, nanging kita bisa nyetel wektu ngaso maksimum Stop-The-World.

Sapuan Mark bebarengan

Pengumpul sampah Concurrent Mark Sweep (CMS) duwe tujuan kanggo nyuda wektu jeda maksimal kanthi nindakake sawetara tugas pengumpulan sampah bebarengan karo utas aplikasi. Pengumpul sampah iki cocog kanggo ngatur jumlah data ing memori. Concurrent Mark Sweep (CMS) minangka alternatif kanggo Parallel GC ing Java Virtual Machine (JVM). Iki ditrapake kanggo aplikasi sing mbutuhake akses menyang sawetara inti prosesor lan sensitif marang ngaso Stop-The-World. CMS nindakake langkah-langkah pengumpulan sampah kanthi podo karo program utama, sing ngidini bisa mlaku tanpa mandheg. Iki nggunakake organisasi memori sing padha karo kolektor Serial lan Paralel, nanging ora ngenteni wilayah Tenured diisi sadurunge mbukak purge generasi lawas. Nanging, mlaku ing latar mburi lan nyoba supaya wilayah Tenured tetep kompak. Concurrent Mark Sweep diwiwiti kanthi fase menehi tandha awal sing mandheg sedhela utas utama aplikasi lan menehi tandha kabeh obyek sing bisa diakses saka root. Utas utama aplikasi banjur diterusake lan CMS wiwit nggoleki kabeh obyek aktif sing bisa diakses kanthi pranala saka obyek root sing ditandhani. Sawise menehi tandha kabeh obyek sing urip, kolektor mbusak memori obyek mati ing sawetara benang paralel. Salah sawijining keuntungan saka CMS yaiku fokus kanggo nyuda downtime, sing penting kanggo akeh aplikasi. Nanging, mbutuhake pengorbanan babagan sumber daya CPU lan bandwidth sakabèhé. Kajaba iku, CMS ora ngompres obyek ing generasi lawas, sing ndadékaké fragmentasi. Ngaso dawa amarga bisa gagal mode paralel bisa dadi kejutan sing ora nyenengake (sanajan ora kerep kedadeyan). Yen memori cukup, CMS bisa nyegah jeda kasebut. Pros: Cepet. Wis cilik Stop-The-World ngaso. Cons: nggunakake memori luwih akeh, yen memori ora cukup, sawetara ngaso bisa uga dawa. Ora apik banget yen aplikasi nggawe akeh obyek.

Sampah-Kawitan

Garbage-First (G1) dianggep minangka alternatif kanggo CMS, utamane kanggo aplikasi server sing mlaku ing server multi-prosesor lan ngatur set data gedhe. Pengumpul sampah G1 ngowahi memori dadi pirang-pirang wilayah sing ukurane padha, kajaba wilayah sing gedhe banget (sing digawe kanthi nggabungake wilayah biasa kanggo nampung obyek gedhe). Wilayah ora kudu diatur kanthi berturut-turut lan bisa ngganti afiliasi generasi. Pembersihan cilik ditindakake kanthi periodik kanggo generasi enom lan mindhah obyek menyang wilayah Survivor utawa nganyarke menyang generasi lawas lan ditransfer menyang Tenured. Reresik ditindakake mung ing wilayah kasebut supaya ora ngluwihi wektu sing dikarepake. Penagih dhewe prédhiksi lan milih wilayah kanthi jumlah sampah paling akeh kanggo ngresiki. Sapuan lengkap nggunakake daur ulang tandha kanggo nggawe dhaptar obyek urip sing mlaku kanthi podo karo aplikasi utama. Sawise siklus menehi tandha, G1 ngalih kanggo nglakokake pembersihan campuran, sing nambah wilayah generasi lawas menyang set wilayah generasi enom sing bakal diresiki. Penagih sampah G1 dianggep luwih akurat tinimbang kolektor CMS kanggo prédhiksi ukuran jeda lan luwih apik nyebarake koleksi sampah ing wektu kanggo nyegah wektu mandheg aplikasi sing dawa, utamane kanthi ukuran tumpukan gedhe. Uga ora fragmen memori kaya kolektor CMS. Nanging, kolektor G1 mbutuhake sumber daya CPU luwih akeh supaya bisa mlaku bebarengan karo program utama, sing nyuda throughput aplikasi. Pros: Bisa luwih apik tinimbang CMS. Nduwe jeda sing luwih cendhek. Cons: Nganggo sumber daya CPU liyane. Uga nganggo memori liyane yen kita duwe akeh obyek cukup gedhe (luwih saka 500 KB) amarga nempatno obyek kuwi ing siji wilayah (1-32 MB).

Epsilon GC

Epsilon GC dirancang kanggo kahanan sing ora mbutuhake pengumpulan sampah. Ora nindakake koleksi sampah, nanging nggunakake TLAB (buffer alokasi benang-lokal) kanggo nyedhiakke obyek anyar - buffer memori cilik sing dijaluk dening benang individu saka tumpukan. Obyek gedhe sing ora cocog karo pamblokiran memori panyuwunan buffer khusus kanggo awake dhewe. Nalika Epsilon GC metu saka sumber daya, OutOfMemoryError kui lan proses mungkasi. Keuntungan saka Epsilon GC kalebu syarat sumber daya sing luwih murah lan alokasi memori sing luwih cepet kanggo aplikasi sing nggawe kabeh obyek sing dibutuhake nalika wiwitan utawa mbukak aplikasi sing ora nggunakake kabeh memori sing diparengake. Epsilon GC uga bisa mbantu nganalisa syarat sumber daya sing ditambahake pengumpul sampah liyane menyang aplikasi sampeyan. Pros: Cepet banget. Cons: Ora mbusak obyek :) Loro kolektor sabanjuré sing paling majeng saka jenis sing, nanging uga paling Komplek. Mula, kita bakal nimbang kanthi ringkes.

ZGC

ZGC bisa njaga latensi sub-milidetik sanajan nangani data sing akeh banget. ZGC minangka kolektor sampah sing dikembangake dening Oracle for Java sing dirancang kanggo nyedhiyakake throughput sing dhuwur lan latency sing sithik nalika ngolah tumpukan gedhe (nganti 16 TB). ZGC adhedhasar prinsip memori virtual lan nggunakake tandha werna beda kanggo trek negara obyek sak uwuh. Kaluwihan: Ngaso kurang saka milidetik, sanajan ing tumpukan gedhe, sing migunani banget kanggo aplikasi sing mbutuhake wektu pangolahan pitakon sing cendhak. Kerjane karo tumpukan gedhe banget kanthi throughput sing apik. ZGC bisa ngompres memori tumpukan nalika nglumpukake sampah. Cons: Panggunaan CPU dhuwur lan syarat kinerja sing signifikan, sing bisa nyuda wektu peluncuran aplikasi.

Shenandoah G.C.

Shenandoah GC minangka kolektor sampah liyane kanthi ngaso cendhak preduli saka ukuran tumpukan. Pengumpul sampah iki dikembangake dening Red Hat. Iki dirancang kanggo nyilikake wektu aplikasi mbuwang sampah. Kaya ZGC, iku kolektor podo, kang tegese mlaku nalika aplikasi lagi mlaku, minimalake ngaso. Shenandoah GC nggunakake "panunjuk maju" kanggo mindhah obyek sajrone ngumpulake sampah. Uga duwe teknik sing diarani "munggah penghalang" kanggo nambah kinerja. Pros: Shenandoah GC bisa entuk wektu ngaso cendhak, asring kurang saka 10ms, malah kanggo tumpukan massive. throughput apik. Cons: mbukak prosesor dhuwur lan kangelan ing karya ing beban abot.

Kesimpulan

Pengumpul sampah minangka salah sawijining tugas sing paling angel ing program. Pangembangan anyar terus ditindakake ing arah kasebut. Nalika iku arang kanggo programer kanggo ngapiki GC, sampeyan isih kudu duwe paling ngerti liwat carane alat koleksi uwuh bisa.
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION