Programmēšana

Labākā prakse atkritumu savākšanas veicināšanai .Net

Programmā Microsoft.Net atkritumu savākšana ir mehānisms, ko pieņēmis Common Language Runtime (CLR), lai attīrītu jūsu lietojumprogrammas patērētos resursus. Veidojot objektus .Net, tie tiek glabāti pārvaldītajā kaudzē. Lai gan jums ir jāizveido objekti, vairumā gadījumu jums nav jāuztraucas par objektu tīrīšanu - izpildlaiks to izdarītu jūsu vietā.

Tomēr lietojumprogrammā ir jāpieņem paraugprakse, lai atvieglotu atkritumu savākšanu un palīdzētu tai ātrāk iztīrīt resursus. Lai gan .Net ir prasmīgs, atgūstot pārvaldītos objektus, jums jāievēro noteiktas vadlīnijas, lai veicinātu ātrāku atkritumu savākšanu, lai uzlabotu lietojumprogrammas veiktspēju. Šajā rakstā es vēlos iepazīstināt ar diskusiju par to, kā darbojas atkritumu savākšana, kā arī par labāko praksi, lai veicinātu atkritumu savākšanu .Net.

Kad notiek atkritumu savākšana?

Atkritumu savākšana notiek, kad sistēmā ir maz pieejama fiziskā atmiņa vai GC. Kolekcija () metode ir skaidri izsaukta jūsu lietojumprogrammas kodā. Objekti, kas vairs netiek izmantoti vai nav sasniedzami no saknes, ir kandidāti atkritumu savākšanai. Būtībā atkritumu savācējs attīra atmiņu, kuru aizņem objekti, uz kuriem nav atsauču.

Paaudzes

Izpildlaiks pārvalda kaudzi pa paaudzēm. Tā izmanto šīs paaudzes, lai organizētu īslaicīgus un ilgmūžīgus objektus. Jāatzīmē, ka atkritumu savācējs darbojas daudz biežāk zemākajās paaudzēs nekā augstākajās. 0. paaudze satur īslaicīgus objektus, piemēram, pagaidu objektus. Kad objekts tiek izveidots, tas tiek glabāts 0. paaudzē, ja vien tas nav liels objekts. Ja objekts ir liels objekts, tas tiek glabāts 2. paaudzes lielajā objektu kaudzē (LOH). Vairumā gadījumu atkritumu savācējs atgūst 0. paaudzes objektus, kad tas darbojas fonā.

Rakstot kodu, jums jāievēro noteikta paraugprakse. Piemēram, jums vajadzētu pēc iespējas izveidot objektus vietējā mērogā, lai atvieglotu atkritumu savākšanu. Objekti, kas ir izveidoti augstākā diapazonā, atmiņā parasti uzturas ilgāku laiku. Varat izmantot CLR profilētāja priekšrocības, lai izprastu savas lietojumprogrammas piešķiršanas modeļus.

Jums vajadzētu izvairīties zvanīt uz GC. Kolekcija () metodi, jo tas rada visu paaudžu pilnu kolekciju (0., 1. un 2. paaudze). Kad veicat zvanu uz GC. Kolekcija () metodi izpildlaiks apmeklē visus jūsu lietojumprogrammā esošos aktīvos objektus. Tas prasa ievērojamu laiku un līdz ar to ir ļoti dārga darbība. Rezultātā nav laba prakse saukt GC. Kolekcija () metodi.

Ja jums ir jāzvana GC. Kolekcija () metodi, jums vajadzētu piezvanīt GC.WaitForPendingFinalizers () pēc zvana uz GC. Kolekcija () lai pārliecinātos, ka pašreizējais izpildes pavediens gaida, kamēr ir izpildīti visu objektu finālisti.

Pēc tam jums vajadzētu piezvanīt uz GC. Kolekcija () metodi, lai pārliecinātos, ka jūs savācat atlikušos mirušos objektus. Šie mirušie objekti, kas, iespējams, tika izveidoti, pateicoties objektu izsaukumam uz metodi Finalizer. Šis koda fragments parāda, kā tiek izmantotas šīs metodes.

System.GC.Collect ();

System.GC.WaitForPendingFinalizers ();

System.GC.Collect ();

Jums jānodrošina, lai jūs pēc iespējas samazinātu slēptos piešķīrumus un uzrakstītu kodu tā, lai tiktu izslēgtas īslaicīgu objektu reklamēšanas iespējas augstākām paaudzēm. Jums nevajadzētu atsaukties uz īslaicīgiem priekšmetiem no ilgdzīvotājiem, lai izvairītos no īslaicīgu objektu reklamēšanas augstākām paaudzēm.

Jums vajadzētu arī izvairīties no finālistu rakstīšanas savām nodarbībām. Ja jūsu klasē ir ieviests pabeigšanas rīks, šādu klašu objekti kļūst par ilgmūžīgiem objektiem, jo ​​izpildlaika laikā ir jāpopularizējamie objekti jāpaaugstina vecākajām paaudzēm. Pirms ilgstoša zvana jāveic objektu iestatīšana uz nulli, ja lietojumprogrammai šādi objekti nav vajadzīgi. Ja lietojumprogrammā vairs nav nepieciešams statisks objekts vai citi objekti, pirms ilgstoša zvana veikšanas tas jāiestata uz nulli. Jums nevajadzētu iestatīt vietējos mainīgos uz nulli, jo tas nav vajadzīgs; izpildlaiks var noteikt, kurš vietējais objekts nav norādīts jūsu kodā vai vairs netiek izmantots, tāpēc jums nav skaidri jāiestata neviens vietējais mainīgais.

$config[zx-auto] not found$config[zx-overlay] not found