Programavimas

Geriausia praktika, kaip palengvinti šiukšlių surinkimą .Net

Programoje „Microsoft.Net“ šiukšlių surinkimas yra mechanizmas, kurį naudoja „Common Language Runtime“ (CLR), kad išvalytų jūsų programos sunaudotus išteklius. Kai kuriate objektus .Net, jie saugomi valdomame kaupe. Nors jums reikia sukurti objektus, daugeliu atvejų jums nereikia jaudintis dėl objektų valymo - vykdymo laikas tai padarytų už jus.

Tačiau, norėdami palengvinti šiukšlių surinkimą ir padėti greičiau išvalyti išteklius, turėtumėte pritaikyti geriausią savo programos patirtį. Nors .Net išmano susigrąžindamas valdomus objektus, turėtumėte vadovautis tam tikromis gairėmis, kad palengvintumėte greitesnį šiukšlių surinkimą ir pagerintumėte savo programos našumą. Šiame straipsnyje norėčiau pristatyti diskusiją apie tai, kaip veikia šiukšlių surinkimas, ir apie geriausią praktiką, kaip palengvinti šiukšlių surinkimą .Net.

Kada vyksta šiukšlių surinkimas?

Šiukšlės surenkamos, kai sistemoje trūksta laisvos fizinės atminties arba GC. Surinkite () metodas yra aiškiai vadinamas jūsų programos kode. Objektai, kurie nebenaudojami arba kurių negalima pasiekti nuo šaknų, yra kandidatai į šiukšlių surinkimą. Iš esmės šiukšlių surinkėjas išvalo atmintį, kurią užima objektai, neturintys nuorodų.

Kartos

Vykdymo laikas tvarkomą kaupą organizuoja kartomis. Šias kartas jis naudoja sutvarkyti trumpo ir ilgaamžiškus objektus. Reikėtų pažymėti, kad šiukšlių surinkėjas dirba daug dažniau žemesnėse kartose nei aukštesnėse. 0 kartoje yra trumpalaikiai objektai, tokie kaip laikini objektai. Sukūrus objektą, jis saugomas 0 kartoje, nebent tai yra didelis objektas. Jei objektas yra didelis objektas, jis saugomas 2 kartos dideliame objekto kaupe (LOH). Daugeliu atvejų 0 kartos objektus šiukšlių surinkėjas susigrąžina, kai jie veikia fone.

Rašydami kodą turėtumėte laikytis tam tikros geriausios praktikos. Kaip pavyzdį, turėtumėte kiek įmanoma sukurti objektus vietos mastu, kad palengvintumėte šiukšlių surinkimą. Didesnės apimties objektai yra sukurti atmintyje ilgesnį laiką. Galite pasinaudoti CLR profiliu, kad suprastumėte savo programos paskirstymo modelius.

Turėtumėte vengti skambinti GC. Surinkite () metodas, nes jis sukuria pilną visų kartų (0, 1 ir 2 kartos) kolekciją. Kai paskambinsite į GC. Surinkite () metodas, vykdymo laikas aplanko visus gyvus jūsų programos objektus. Tai užima daug laiko ir todėl yra labai brangi operacija. Todėl nėra gera praktika vadinti GC. Surinkite () metodas.

Jei turite skambinti GC. Surinkite () metodu, turėtumėte paskambinti GC.WaitForPendingFinalizers () po skambučio į GC. Surinkite () užtikrinti, kad dabartinė vykdymo gija laukia, kol bus įvykdyti visų objektų užbaigimo programos.

Tada turėtumėte paskambinti į GC. Surinkite () metodas dar kartą įsitikinkite, kad surinksite likusius negyvus objektus. Šie negyvi objektai, kurie galėjo būti sukurti dėl objekto baigiamojo veiksmo metodo iškvietimo. Šis kodo fragmentas parodo, kaip naudojami šie metodai.

System.GC.Collect ();

System.GC.WaitForPendingFinalizers ();

System.GC.Collect ();

Turėtumėte užtikrinti, kad sumažintumėte paslėptus paskirstymus ir parašytumėte savo kodą taip, kad būtų pašalinta trumpalaikių objektų reklamos galimybė aukštesnėms kartoms. Jūs neturėtumėte nurodyti trumpalaikių objektų nuo ilgaamžių, kad išvengtumėte trumpalaikių objektų reklamavimo aukštesnėms kartoms.

Taip pat turėtumėte vengti rašyti savo užsiėmimų finalistus. Jei turite savo klasėje įdiegtą užbaigimo priemonę, tokių klasių objektai taptų ilgaamžiškais objektais, nes vykdymo metu reikia reklamuoti užbaigtus objektus vyresnėms kartoms. Prieš skambindami ilgai trunkantį skambutį, turėtumėte nustatyti objektų nulį, jei tokie objektai programai nereikalingi. Jei jūsų programoje nebereikia statinio objekto ar kitų objektų, prieš atlikdami ilgą skambutį turėtumėte jį nustatyti kaip nulį. Nereikėtų nustatyti vietinių kintamųjų į nulį, nes to nereikia; vykdymo laikas gali nustatyti, kuris vietinis objektas nėra nurodytas jūsų kode arba nenaudojamas toliau, todėl jums nereikia aiškiai nustatyti jokio vietinio kintamojo į nulį.

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