V programskih jezikih ima lahko predmet v času obstoja le spremenljivko, potem ko ga instancija ne more spremeniti. Tako isti pomnilniški celici ni mogoče dodeliti novim vrednostim, zato je za upravljanje neporabljenih prostorov potrebno nekakšno avtomatizirano upravljanje pomnilnika. Te neuporabljene prostore imenujemo smeti in celoten postopek učinkovitega upravljanja spomina se imenuje zbiranje smeti.
Glavni cilj zbiralca smeti je ločiti odmrle predmete od živih predmetov in povrniti prostor za ponovno uporabo. V bistvu celotna zadeva deluje na upravljanem kupu, ki ni nič drugega kot blok spomina in zbiralnik smeti občasno preveri pomnilniški kup, da pomnilnik dodeli novim predmetom. Obstajata dva načina za sprostitev neupravljanih virov, kot so datoteke in povezave z bazo podatkov: Dispose and Finalize.
Ta članek vam pomaga razumeti razliko med obema.
Odlaganje je standardni način, da uporabniki povedo predmete, naj sprostijo svoje vire, in ne poskušajo znova dostopati do predmetov. Način odstranjevanja omogoča nadzor eksplicitnega čiščenja pomnilnika tako, da postanejo predmeti neuporabni.
Ko uporabniki pokličejo metodo Dispose (), naj bi predmet sprostil vse svoje drage vire in s tem omogočil ponovno uporabo. Zbiralnik smeti ga nikoli ne pokliče, ki se začne igrati šele takrat, ko upravljani spomin postane redek. Za odločanje, kje in kako izvajati Dispose (), se uporablja poseben vmesnik, imenovan „IDisposable“. Toda kaj se zgodi, ko metoda odlaganja ne pokliče?
Če se metoda odstranjevanja ne pokliče, je rezervni načrt uporaba metode Finalize () za čiščenje. Zbiralnik smeti ga pokliče, da opravi končno čiščenje virov, preden sprosti spomin. Koncept pravočasnega čiščenja postane tukaj neprimerljiv, ker je objekt namesto, da takoj dodelimo pomnilnik, dodan v čakalno vrsto za dokončanje, da bi ga kasneje uničil. Dokončanje je bolj kot zaščitni ukrepi, ki se vzpostavijo v primeru napake pri programiranju, odstranjevanje pa ne očisti virov, v tem primeru pa zbiralec smeti pokliče metodo Finalize (), da odstrani nedosegljive predmete v poljubnem zaporedju.
Za odstranjevanje neupravljanih virov, kot so ročaji baze podatkov, ročaji datotek, semaforji in drugi predmeti, ki jih dodeli operacijski sistem, se zahteva način odstranjevanja. Način odstranjevanja se prikliče za izvajanje kode, ki je potrebna za čiščenje neuporabljenega pomnilnika in omejenih virov, kot so ročaji GDI. Preprosto povedano, metoda odlaganja omogoča nadzor eksplicitnega čiščenja pomnilnika. Metoda dodelave je na drugi strani del zbiranja smeti, ki se uporablja za izvedbo končnega čiščenja na predmetu, še preden se ga odnese. Preprosto povedano, metoda dokončanja je poklicana, da sprosti neupravljane vire, ki jih ima predmet, preden je uničen.
Način odstranjevanja lahko izrecno pokliče uporabniška koda in razred, ki izvaja metodo razpolaganja z viri. Vendar pomnilnika ni mogoče sprostiti, dokler zbiralnik ne izvede postopka čiščenja. Metodo lahko pokličemo, tudi če še obstajajo druge reference na predmet. Zbiralnik smeti lahko v nasprotnem primeru prikliče način zbiranja smeti šele potem, ko ugotovi, da je zadnji primerek pomnilniškega predmeta uničen in ni več sklicevanja na predmet. Po izvedbi metode dodelave se predmet odstrani iz pomnilniškega vira.
Postopek odstranjevanja predmeta iz pomnilnika se imenuje odstranjevalni vzorec, ki ga lahko uporabimo za predmete, ki dostopajo do neurejenih virov, ker zbiralnik smeti ne more vrniti neurejenih virov. Vmesnik „IDisposable“ in dodatna metoda Dispose (Boolean) se izvedeta s sprostitvijo neurejenih virov. Metoda dokončanja se izvede, ko primerek predmeta uniči pred njegovo premestitvijo. To je nedeterministična metoda, ki se pojavi po presoji zbiralca smeti in se sploh ne pojavi. Na upravljanih objektih se ne sme izvajati, dokler ni nujno potrebno.
Veliko hitreje je uporabljati način odstranjevanja, ne pa dokončati za takojšnje odstranjevanje predmetov. Destruktorji se samodejno pretvorijo v finalizacijo metode med izvajanjem. Zbiralnik smeti se samodejno prikliče, ko predmet izstopi iz področja, kar se običajno zgodi, ko je primerek tega predmeta uničen. Težava pri dokončni metodi je, da je nedefiniran, kar pomeni, da ni gotovo, kdaj ponovno zajeti spomin, na katerega se ne sme več sklicevati. Vendar pa spomin morda ne bo sprostil takoj; v resnici ga ni mogoče poklicati in ga ni mogoče izrecno prisiliti.
Glavna razlika med metodami odstranjevanja in dokončanja je v tem, da je prva determinirana metoda, ki predmete takoj odloži, ko jih ni več v uporabi, medtem ko je slednja nedeterministična metoda za dodeljevanje neupravljanih virov, kar pomeni, da gre za povratno metodo sprostitve primeri pomnilniških predmetov, ko gredo izven območja pred premestitvijo. Vedno je priporočljivo uporabiti metodo odstranjevanja dokončno, če ni nujno potrebno.
Z drugimi besedami, dodelava je zaščitni ukrep za čiščenje nenadzorovanih virov, kadar metode odstranjevanja ni mogoče poklicati v primeru neke programske napake. Metoda dokončanja pokliče zbiralnik smeti, ko bo predmet vržen iz pomnilniškega nakupa.