CodeGym /Java Blog /Random /Higit pa tungkol sa kolektor ng basura
John Squirrels
Antas
San Francisco

Higit pa tungkol sa kolektor ng basura

Nai-publish sa grupo
Hi! Sa huling aralin, una naming nakilala ang built-in na kolektor ng basura ng Java at nakakuha ng magaspang na ideya kung paano ito gumagana. Gumagana ito sa background habang tumatakbo ang iyong program, nangongolekta ng mga hindi kinakailangang bagay na tatanggalin sa ibang pagkakataon. Kaya, pinapalaya nito ang memorya na maaaring magamit upang lumikha ng mga bagong bagay sa hinaharap.
Higit pa tungkol sa kolektor ng basura - 1
Sa araling ito, tatalakayin natin nang mas detalyado kung paano ito gumagana. Halimbawa, paano at kailan nagiging hindi kailangan ang isang bagay? At paano nalaman ng basurero? Ito ang mga tanong na sasagutin natin sa aralin ngayon :) Ang aralin ay magiging higit na katulad ng isang pangkalahatang-ideya: hindi mo kailangang matutunan ang materyal na ito nang buong puso. Ang layunin ay higit sa lahat na palawakin ang iyong pananaw tungkol sa kung paano gumagana ang memorya at ang tagakolekta ng basura, kaya basahin mo lang at humanap ng bago para sa iyong sarili :) Tara na! Ang unang bagay na kailangan mong tandaan ay gumagana ang tagakolekta ng basura kasabay ng iyong programa. Hindi ito bahagi ng iyong programa. Ito ay tumatakbo nang hiwalay (sa huling aralin, inihambing namin ito sa isang robot vacuum cleaner) Ngunit hindi palaging ganoon. Ang pangongolekta ng basura dati ay ginagawa sa parehong thread ng iyong programa. Sa ilang iskedyul (minsan bawat ilang minuto), titingnan ng tagakolekta ng basura kung may mga hindi gustong bagay sa programa. Ang problema ay ang programa ay mag-hang (hindi isasagawa) sa panahon ng pagsusuri at pagkolekta ng basura. Isipin na nakaupo ka sa iyong opisina sa trabaho. Ngunit pagkatapos ay pumasok ang naglilinis na babae upang maghugas ng sahig. Itinaboy ka niya palayo sa iyong computer sa loob ng 5 minuto at maghihintay ka hanggang matapos siyang maglinis. Sa panahong ito, hindi ka makakapagtrabaho. Iyan ay tungkol sa kung paano gumagana ang pangongolekta ng basura dati :) Ang mekanismong ito ay binago sa kalaunan, at ngayon ang tagakolekta ng basura ay tumatakbo sa background, hindi humahadlang sa gawain ng mismong programa. Alam mo na na ang isang bagay ay namamatay kapag wala na itong mga sanggunian. Sa totoo,hindi binibilang ng tagakolekta ng basura ang mga object reference . Una, maaaring tumagal ito ng mahabang panahon. Pangalawa, hindi ito masyadong epektibo. Pagkatapos ng lahat, ang mga bagay ay maaaring sumangguni sa bawat isa! Higit pa tungkol sa kolektor ng basura - 2Ang figure ay nagpapakita ng isang halimbawa kung saan ang 3 bagay ay tumutukoy sa isa't isa, ngunit walang ibang tumutukoy sa kanila. Sa madaling salita, ang natitirang bahagi ng programa ay hindi nangangailangan ng mga ito. Kung ang tagakolekta ng basura ay nagbibilang lamang ng mga sanggunian, ang 3 bagay na ito ay hindi kokolektahin at ang memorya ay hindi mapapalaya (may mga sanggunian sa kanila!). Maihahambing natin ito sa isang spacecraft. Sa panahon ng paglipad, nagpasya ang mga astronaut na suriin ang listahan ng mga ekstrang bahagi na magagamit para sa pag-aayos. Sa iba pang mga bagay, nakahanap sila ng manibela at mga pedal mula sa isang ordinaryong kotse. Malinaw, hindi sila kailangan dito at kumukuha ng espasyo nang hindi kinakailangan (bagama't ang dalawang bahaging ito ay nauugnay sa isa't isa at may ilang mga function). Ngunit sa loob ng spacecraft, sila ay walang silbi na basura na dapat itapon. Alinsunod dito, sa Java, ang desisyon ay ginawa upang mangolekta ng basura batay hindi sa pagbibilang ng sanggunian,maabot at hindi maabot . Paano natin matutukoy kung ang isang bagay ay naaabot? Ang lahat ng ito ay simpleng mapanlikha. Ang isang bagay ay maaabot kung ito ay isinangguni ng isa pang maabot na bagay. Kaya, nakakakuha tayo ng "chain of reachability". Nagsisimula ito kapag nagsimula ang programa at nagpapatuloy sa tagal ng programa. Mukhang ganito: Higit pa tungkol sa kolektor ng basura - 3 Ang arrow sa figure ay nagpapahiwatig ng executable code ng aming program. Ang code (halimbawa, ang main()pamamaraan) ay lumilikha ng mga sanggunian sa mga bagay. Ang mga bagay na ito ay maaaring tumukoy sa iba pang mga bagay, sa mga bagay na iyon sa iba pa, at iba pa. Ito ay bumubuo ng isang reference chain. Kung masusubaybayan mo ang kadena mula sa isang bagay patungo sa "root reference" (ang nilikha nang direkta sa executable code), kung gayon ito ay itinuturing na maaabot. Ang mga naturang bagay ay minarkahan ng itim sa larawan. Ngunit ang isang bagay ay hindi maabot kung ang bagay ay bumaba sa kadena na ito, ibig sabihin, wala sa mga variable sa code na kasalukuyang isinasagawa ang tumutukoy dito, at hindi ito maabot sa pamamagitan ng "reference chain". Sa aming programa, dalawang ganoong bagay ang minarkahan ng pula. Tandaan na ang mga "pula" na bagay na ito ay may mga sanggunian sa isa't isa. Ngunit tulad ng sinabi namin kanina, ang modernong tagakolekta ng basura ng Java ay hindi nagbibilang ng mga sanggunian. Tinutukoy nito kung ang isang bagay ay maabot o hindi maabot. Bilang resulta, sasakupin nito ang dalawang pulang bagay sa pigura. Ngayon tingnan natin ang buong proseso mula simula hanggang wakas. Sa paggawa nito, makikita rin natin kung paano nakaayos ang memorya sa Java :) Lahat ng Java objects ay nakaimbak sa isang espesyal na lugar ng memorya na tinatawag na heap . Sa pang-araw-araw na wika, ang isang bunton ay karaniwang isang bundok ng mga bagay, kung saan ang lahat ay magkakahalo. Ngunit hindi iyon ang heap sa Java. Ang istraktura nito ay napaka-lohikal at makatwiran. Sa ilang mga punto, natuklasan ng mga programmer ng Java na ang lahat ng kanilang mga bagay ay maaaring nahahati sa dalawang uri: mga simpleng bagay at "mga bagay na matagal nang nabubuhay". Ang "mga bagay na matagal nang nabubuhay" ay mga bagay na nakaligtas sa maraming round ng koleksyon ng basura. Karaniwan silang nabubuhay hanggang sa matapos ang programa. Sa huli, ang buong bunton, kung saan naka-imbak ang lahat ng bagay, ay nahahati sa ilang bahagi. Ang unang bahagi ay may magandang pangalan: eden(mula sa biblikal na "Hardin ng Eden"). Angkop ang pangalang ito, dahil dito napupunta ang mga bagay pagkatapos gawin ang mga ito. Ito ang bahagi ng memorya kung saan ang mga bagong bagay ay nilikha kapag ginamit namin ang keyword na bago. Maraming bagay ang maaaring malikha. Kapag naubusan ng espasyo ang lugar na ito, magsisimula ang paunang "mabilis" na koleksyon ng basura. Dapat nating sabihin na ang tagakolekta ng basura ay napakatalino. Pumipili ito ng algorithm batay sa kung ang heap ay may mas maraming basura o mas maraming live na bagay. Kung halos lahat ng mga bagay ay basura, minarkahan ng kolektor ang mga live na bagay at inililipat ang mga ito sa ibang lugar ng memorya. Pagkatapos ang kasalukuyang lugar ay ganap na na-clear. Kung walang maraming basura, at ang tambak ay halos mga buhay na bagay, minarkahan ng kolektor ang basura, linisin ito, at pinagsama-sama ang iba pang mga bagay. Sabi namin "isang survival space . Ang isang survival space , sa turn, ay nahahati sa mga henerasyon . Ang bawat bagay ay nabibilang sa isang partikular na henerasyon, depende sa kung ilang round ng koleksyon ng basura ang nakaligtas dito. Kung ang isang bagay ay nakaligtas sa isang round ng koleksyon ng basura, kung gayon ito ay nasa "Generation 1"; kung 5, pagkatapos ay "Generation 5". Magkasama, ang eden at isang survival space ay bumubuo ng isang lugar na tinatawag na young generation . Bilang karagdagan sa mga batang henerasyon, ang heap ay may isa pang lugar ng memorya na tinatawag na lumang henerasyon. Ito mismo ang lugar kung saan napupunta ang mga matagal nang bagay na nakaligtas sa maraming round ng koleksyon ng basura. May mga pakinabang sa pagpapanatiling hiwalay sa lahat ng iba pa. Ang buong koleksyon ng basura ay ginagawa lamang kapag puno na ang lumang henerasyon, ibig sabihin, napakaraming pangmatagalang bagay sa programa na walang sapat na memorya. Ang prosesong ito ay nagsasangkot ng higit sa isang lugar ng memorya. Sa pangkalahatan, kinasasangkutan nito ang lahat ng mga bagay na nilikha ng Java machine. Naturally, ito ay nangangailangan ng mas maraming oras at mapagkukunan. Ito ay tiyak na ginawa ang desisyon na mag-imbak ng mga pangmatagalang bagay nang hiwalay. Ang "mabilis na pangongolekta ng basura" ay isinasagawa kapag ang ibang mga lugar ay naubusan ng espasyo. Ito ay nagsasangkot lamang ng isang lugar, na ginagawang mas mabilis at mas mahusay. Sa wakas, kapag ang lugar para sa pangmatagalang bagay ay ganap na napuno, ang buong koleksyon ng basura ay na-trigger. Kaya, ginagamit lamang ng kolektor ang "pinakamabigat" na tool kapag imposibleng maiwasan ito. Narito ang isang visual na representasyon ng istraktura ng tambak at koleksyon ng basura: Higit pa tungkol sa kolektor ng basura - 4
Mga komento
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION