Programmēšanas valodās objektam tā pastāvēšanas laikā var būt tikai mainīgs lielums, pēc tam, kad tas notiek, to nevar modificēt. Tātad to pašu atmiņas elementu nevar piešķirt jaunām vērtībām, tāpēc neizmantoto vietu pārvaldīšanai ir nepieciešama sava veida automatizēta atmiņas pārvaldība. Šīs neizmantotās vietas sauc par atkritumiem, un visu efektīvās atmiņas pārvaldības procesu sauc par atkritumu savākšanu.
Atkritumu savācēja galvenais mērķis ir atdalīt mirušos priekšmetus no dzīviem objektiem un atgūt vietu atkārtotai izmantošanai. Būtībā viss darbojas uz pārvaldītas kaudzes, kas nav nekas cits kā atmiņas bloks, un atkritumu savācējs periodiski pārbauda kaudzes atmiņu, lai atvēlētu atmiņu jauniem objektiem. Ir divas metodes, kā atbrīvot nepārvaldītus resursus, piemēram, failus un datu bāzes savienojumus: iznīcināt un pabeigt.
Šis raksts palīdz saprast atšķirību starp abiem.
Apglabāšana ir standarta veids, kā lietotāji var norādīt objektiem atbrīvot savus resursus un nemēģināt vēlreiz piekļūt objektiem. Apglabāšanas metode nodrošina skaidras atmiņas tīrīšanu, padarot objektus nelietojamus.
Kad lietotāji izsauc metodi Dispose (), objektam vajadzētu atbrīvot visus dārgos resursus, tādējādi padarot to pieejamu atkārtotai izmantošanai. Atkritumu savācējs to nekad neaicina un spēlē tikai tad, kad trūkst pārvaldītās atmiņas. Lai izlemtu, kur un kā ieviest utilizāciju (), tiek izmantots īpašs interfeiss ar nosaukumu “IDisposable”. Bet kas notiek, ja atsaukšanas metode netiek saukta?
Ja apglabāšanas metode netiek saukta, rezerves plāns ir tīrīšanai izmantot metodi Finalize (). Atkritumu savācējs to aicina veikt galīgo resursu tīrīšanu, pirms tā atbrīvo atmiņu. Savlaicīgas tīrīšanas jēdziens šeit nav piemērojams, jo tā vietā, lai nekavējoties atdalītu atmiņu, objekts tiek pievienots pabeigšanas rindai tikai iznīcināšanai vēlāk. Pabeigt ir vairāk kā drošības līdzeklis, kas tiek ieviests programmēšanas kļūdas gadījumā, un utilizācija netīra resursus. Šajā gadījumā atkritumu savācējs izsauc metodi Finalize (), lai noņemtu nepieejamus objektus jebkurā secībā..
Apglabāšanas metode tiek izsaukta, lai paātrinātu nepārvaldītu resursu, piemēram, datu bāzu rokturi, failu rokturi, semafori un citi operētājsistēmas piešķirtie objekti, atbrīvošanu. Tiek izmantota atsaukšanas metode, lai izpildītu kodu, kas nepieciešams neizmantotās atmiņas un tādu ierobežotu resursu, kā GDI rokturi, tīrīšanai. Vienkārši izsakoties, dispose metode nodrošina skaidras atmiņas tīrīšanas kontroli. Nobeiguma metode, no otras puses, ir daļa no atkritumu savākšanas, ko izmanto, lai objektam veiktu galīgo tīrīšanu pirms tā savākšanas. Vienkārši sakot, pabeigšanas metode tiek aicināta atbrīvot nepārvaldītus resursus, kas atrodas objektā, pirms tas tiek iznīcināts.
Apglabāšanas metodi var skaidri izsaukt, izmantojot lietotāja kodu un klasi, kas realizē metodi resursu apglabāšanai. Tomēr atmiņu nevar atbrīvot, kamēr atkritumu savācējs nav veicis tīrīšanas procesu. Metodi var nosaukt pat tad, ja joprojām pastāv citas atsauces uz objektu. Pabeigt metodi, gluži pretēji, atkritumu savācējs var izmantot tikai pēc tam, kad ir noteikts, ka pēdējais atmiņas objekta gadījums ir iznīcināts un vairs nav norāžu uz objektu. Pēc pabeigšanas metodes izpildes objekts tiek noņemts no kaudzes atmiņas.
Objekta atsaukšanas procesu no atmiņas sauc par utilizācijas modeli, ko var izmantot objektiem, kuri piekļūst nepārvaldītiem resursiem, jo atkritumu savācējs nespēj atgūt neapsaimniekotus resursus. Tiek ieviesta saskarne “IDisposable” kopā ar papildu apglabāšanas (Būla) metodi, kurā tiek prasīts atbrīvot neapsaimniekotus resursus. Pabeigšanas metode tiek izpildīta, ja objekta eksemplārs tiek iznīcināts pirms tā izvietošanas. Tā ir metode, kas nav determinēta un kas rodas pēc atkritumu savācēja ieskatiem un, iespējams, pat nenotiek. To nevajadzētu ieviest pārvaldītos objektos, kamēr tas nav ārkārtīgi nepieciešams.
Daudz ātrāk ir izmantot apglabāšanas metodi, nevis pabeigt tūlītēju objektu iznīcināšanu. Iznīcinātāji tiek automātiski pārveidoti, lai pabeigtu metodi izpildlaikā. Atkritumu savācējs uz to automātiski atsaucas, kad objekts iziet no darbības jomas, kas parasti notiek, iznīcinot šī objekta instanci. Pabeigšanas metodes problēma ir tā, ka tā nav deterministiska, tāpēc nav skaidrs, kad atgūt atmiņu, uz kuru vairs neattiecas atkritumu savākšana. Tomēr tas, iespējams, nekavējoties neatbrīvo atmiņu; patiesībā to nekad nevar saukt un to nevar tieši piespiest.
Galvenā atšķirība starp disponēšanas un pabeigšanas metodēm ir tā, ka pirmā ir deterministiska metode, ar kuras palīdzību tūlīt iznīcina objektus, kad tie vairs netiek izmantoti, savukārt otrā ir nenoteiktāka metode, lai piešķirtu nepārvaldītus resursus, kas nozīmē, ka tā ir backstop metode, lai atbrīvotu atmiņas objektu gadījumi, kad tie pirms darījuma izvietošanas iziet no darbības jomas. Vienmēr ieteicams izmantot iznīcināšanas metodi, ja vien tas nav ārkārtīgi nepieciešams.
Citiem vārdiem sakot, pabeigt ir nodrošinājums, kas ieviests, lai attīrītu nepārvaldītus resursus, ja apglabāšanas metodi nevar izsaukt kādas programmēšanas kļūdas gadījumā. Pabeigt metodi izsauc atkritumu savācējs, kad priekšmets tiek izmests no kaudzes atmiņas.