Programiranje

Najboljše prakse za lažje zbiranje smeti v .Net

V Microsoft.Net je zbiranje smeti mehanizem, ki ga je sprejel Common Language Runtime (CLR) za čiščenje virov, ki jih porabi vaša aplikacija. Ko v .Netu ustvarite predmete, se shranijo v upravljani kup. Čeprav morate ustvariti predmete, vam v večini primerov ni treba skrbeti za čiščenje predmetov - čas izvajanja bi to naredil namesto vas.

Vendar bi morali v svoji aplikaciji sprejeti najboljše prakse za lažje zbiranje smeti in hitrejše čiščenje virov. Čeprav je .Net spreten pri pridobivanju upravljanih predmetov, morate upoštevati določene smernice, da boste olajšali hitrejše zbiranje smeti in izboljšali delovanje vaše aplikacije. V tem članku bi rad predstavil razpravo o tem, kako zbiranje smeti deluje, in najboljše prakse za lažje zbiranje smeti v .Netu.

Kdaj poteka odvoz smeti?

Odvoz smeti poteka, ko je v sistemu malo razpoložljivega fizičnega pomnilnika ali GC.Collect () metoda se v kodi vaše aplikacije izrecno pokliče. Predmeti, ki se ne uporabljajo več ali so nedosegljivi v korenu, so kandidati za odvoz smeti. V bistvu zbiralnik smeti očisti pomnilnik, ki ga zasedajo predmeti, ki nimajo referenc.

Generacije

Izvajalno okolje upravlja upravljano kopico v generacije. Te generacije uporablja za organiziranje kratkotrajnih in dolgoživih predmetov. Treba je opozoriti, da zbiralnik smeti v nižjih generacijah deluje veliko pogosteje kot v višjih. Generacija 0 vsebuje kratkotrajne predmete, kot so začasni predmeti. Ko je objekt ustvarjen, se shrani v generacijo 0, razen če gre za velik objekt. Če je predmet velik objekt, je shranjen v kopici velikih predmetov (LOH) v generaciji 2. V večini primerov zbiralnik smeti, ko deluje v ozadju, predmete generacije 0 povrne nazaj.

Pri pisanju kode se morate držati nekaterih najboljših praks. Kot primer bi morali čim bolj ustvariti predmete v lokalnem obsegu, da olajšate zbiranje smeti. Predmeti, ki so ustvarjeni v višjem obsegu, se običajno nahajajo dlje časa v pomnilniku. Profilir CLR lahko izkoristite za razumevanje vzorcev dodeljevanja vaše aplikacije.

Izogibajte se klicanju GC.Collect () metoda, saj povzroča popolno zbirko vseh generacij (generacija 0, 1 in 2). Ko pokličete na GC.Collect () , izvajalno okolje obišče vse žive predmete v vaši aplikaciji. To traja precej časa in je zato zelo draga operacija. Posledično ni dobra praksa, da pokličemo GC.Collect () metoda.

Če morate poklicati GC.Collect () morate poklicati GC.WaitForPendingFinalizers () po klicu GC.Collect () da zagotovite, da trenutna izvršilna nit čaka, da se zaključijo vsi predmeti.

Nato pokličite GC.Collect () znova zagotovite, da boste zbrali mrtve predmete, ki so ostali. Ti mrtvi predmeti, ki bi lahko bili ustvarjeni zaradi klica metode zaključevanja na predmetih. Naslednji delček kode prikazuje, kako se uporabljajo te metode.

System.GC.Collect ();

System.GC.WaitForPendingFinalizers ();

System.GC.Collect ();

Prepričajte se, da skrite dodelitve zmanjšate na minimum in svojo kodo napišete tako, da so možnosti za promocijo kratkotrajnih predmetov v višje generacije izključene. Kratkoživih predmetov ne smete sklicevati na dolgožive, da se izognete promociji kratkotrajnih predmetov v višje generacije.

Izogibajte se tudi pisanju zaključkov za predavanja. Če imate v svojem razredu implementiran zaključevalnik, bi predmeti takih razredov postali predmeti z dolgo življenjsko dobo, saj mora izvajalno okolje promovirati dokončne predmete starejšim generacijam. Preden začnete dolgotrajni klic, nastavite predmete na nič, če jih ta ne potrebuje. Če v aplikaciji ne potrebujete več statičnega predmeta ali drugih predmetov, ga pred dolgotrajnim klicem nastavite na nič. Lokalnih spremenljivk ne bi smeli nastavljati na nič, ker niso potrebne; izvajalno okolje lahko določi, kateri lokalni objekt ni naveden v vaši kodi ali se ne uporablja več, zato vam nobene lokalne spremenljivke ni treba izrecno nastaviti na nulo.

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