Šiukšlių surinktuvas

Straipsnis iš Vikipedijos, laisvosios enciklopedijos.
   Šiam straipsniui ar jo daliai trūksta išnašų į patikimus šaltinius.
Jūs galite padėti Vikipedijai pridėdami tinkamas išnašas su šaltiniais.

Šiukšlių surinktuvas (angl. garbage collector) kai kurių programavimo kalbų (Java, C#) vykdomosios sistemos dalis, automatiškai naikinanti vykdomojo kodo nebepasiekiamus objektus. Nepasiekiami objektai gali turėti vidinių nuorodų vienas į kitą; teoriškai tai neapsaugo jų nuo panaikinimo, tačiau prasčiau parašyti surinkikliai gali nesugebėti to padaryti, sukeldami atminties nutekėjimą. Šiukšlių surinkimas – programavimo sąvoka, reiškianti automatizuotą atminties valdymą.

Prieš sunaikindamas objektą, surinktuvas iškviečia to objekto užbaigiklį.

Surinktuvų tipai[redaguoti | redaguoti vikitekstą]

Klasikinis šiukšlių surinktuvas savo darbo metu pristabdo vykdomą pagrindinę programą. Kai kada (tarkim, žaidimuose) tokios pauzės nepriimtinos. Tuomet naudojamas inkrementinis surinktuvas, kuris dirba nuolat, šiek tiek sulėtindamas pagrindinės programos vykdymo greitį. Daugiaprocesorinėse sistemose dar gali būti naudojamas lygiagretus surinktuvas, kuris savo darbui užima vieną iš procesorių, palikdamas kitus vykdomai programai. Straipsnio rašymo metu žinomi inkrementiniai ir lygiagretūs surinkėjai dirba lėčiau nei klasikiniai, todėl juos naudoti be reikalo neverta.

Laiko momentas, kuomet bus sunaikintas objektas (taip pat ir kada bus iškviestas jo užbaigiklis) paprastai nėra determinuotas netgi tada, kai pati kalba turi metodus surinktuvui sužadinti (kaip System.gc() Java kalboje). Tokie metodai laikomi „rekomendaciniais“, ir virtuali mašina jų paisyti neprivalo.

Nuskaitymo principai[redaguoti | redaguoti vikitekstą]

Šiukšlių surinktuvas peržiūri visus pasiekiamus objektus (tuos į kurios tebeegzistuoja nuorodos) ir nenaudoja laiko atmesti nepasiekiamiems (į kuriuos nuorodų jau nebėra). Todėl paprastai neverta nenaudojamų objektų saugoti kešuose, buferiuose, tikintis juos panaudoti pakartotinai - „juodai dienai“ susikaupę objektai surinktuvo darbą gali sulėtinti daugiau nei reikia laiko naujiems prireikus sukurti. Tokie dalykai tikslingi tik jei objektai labai dideli, susiję su kitais resursais (duomenų bazės jungtimis ir pan), sukūrimo algoritmas labai sudėtingas arba objektų kaupiama nedaug. Objektus kaupti pakartotinam panaudojimui verta jei yra labai daug procesorių - surinktuvai dažnai neefektyvūs su daug procesorių ir svarbu juos sužadinti kuo rečiau.

Generacijos[redaguoti | redaguoti vikitekstą]

Dauguma naujai sukurtų objektų egzistuoja trumpai bet nedidelė jų dalis gyvena daug ilgiau. Dabartiniai surinktuvai dažnai optimizuojami išskiriant „jaunos“ ir „senos“ generacijos sritis. Nauji objektai pirmiausia kuriami jaunos generacijos srityje kuri kiekvienos surinkimo sesijos metu ištuštinama beveik visa. Išlikę objektai perkeliami į senos generacijos sritį kuriai surinkimo operaciją galima atlikti daug rečiau. Kartais būna dar trečia „nuolatinės generacijos“ (angl. permanent generation) sritis kurios objektai negali būti pašalinti kol apskritai veikia virtuali mašina (sisteminės klasės ir pan).

Atminties fragmentacija[redaguoti | redaguoti vikitekstą]

Ilgiau dirbant, iškyla atminties fragmentacijos problema: skiriant vietą naujiems objektams, „raikoma“ nuo ištisinės atminties dalies, tačiau atlaisvinus laisvas tampa tik to objekto naudotas palyginus nedidelis fragmentas. Ilgiau padirbus, atmintis gali likti sudalyta į daug nedidelių salelių, kurių nebus galima panaudoti prireikus vietos didesniam naujam objektui. Atminties fragmentacijos problema sprendžiama įvairiai (paprasčiausiu atveju – pritrūkus vietos objektai „perstumdomi“, taip sukuriant reikiamo didumo sritį). Siekiant sumažinti fragmentaciją kartais išskiriama didesnė nei reikia atminties sritis (pavyzdžiui, dydis baitais visada kartotinis aštuoniems), kad ją atlaisvinus būtų lengviau panaudoti antrą kartą.

Paskirstytas šiukšlių surinktuvas[redaguoti | redaguoti vikitekstą]

Paskirstytas surinktuvas (angl. distributed garbage collector) reikalingas kuomet programa susideda iš skirtinguose kompiuteriuose vykdomų ir tik per tinklą sąveikaujačių dalių. Serveris kliento prašymu gali sukurti nuotolinį objektą ir perduoti jo nuorodą klientui, tačiau nėra akivaizdu, kiek ilgai jis turi tą sukurtą nuotolinį objektą saugoti (kada klientui jo tikrai daugiau nebeprireiks). Paskirstytas surinktuvas paprastai remiasi nuomos laiko principu. Klientas, gavęs iš serverio nuotolinio objekto nuorodą, prašo (siūsdamas specialią žinutę) objektą saugoti norimą laiko trukmę. Serveris atsakydamas siunčia „nuomos suteikimo“ žinutę, pranešdamas, kiek ilgai jis apsiima saugoti objektą (suteiktas saugojimo laikas gali būti trumpesnis nei prašytas). Jei šiam laikui besibaigiant objektas vis dar reikalingas, klientas siunčia naują prašymą suteikti nuomą. Jei kliento programa natūraliai arba avariniu būdu užsibaigia, kitose sistemos dalyse saugomi susiję objektai tiesiog pašalinami pasibaigus nuomos laikui. Kartais būna specialios žinutės jog objektas nebereikalingas, tačiau jas naudoti sunku nes realiame tinkle žinučių gavimo tvarka nebūtinai lygi jų siuntimo tvarkai.

Įvairūs šiukšlių surinktuvai pamažu tampa svarbia fundamentalių informatikos tyrimų sritimi, kuriai daug padeda pastaruoju metu atsiradusios atviro kodo Java ir kitos virtualios mašinos.[reikalingas šaltinis]