Programavimas

Mano du centai GC. Surinkite metodą C #

GC.Collect () metodas ilgą laiką buvo populiarus tarp .Net kūrėjų. Tačiau vargu ar nedaugelis iš mūsų žino, kaip tai iš tikrųjų veikia, arba, jei apskritai reikia skambinti.

CLR (Common Language Runtime) priima šiukšlių surinkimą kaip priemonę, skirtą išvalyti jūsų programos sunaudotus išteklius. Atkreipkite dėmesį, kad kai kuriate objektus .Net, jie saugomi valdomame kaupe, o kai baigsite juos naudoti, jums nereikės jaudintis dėl jų valymo - vykdymo laikas tai padarys už jus.

CLR tvarkomą kaupą organizuoja kartomis. Trys kartos, į kurias organizuojamas valdomas kaupas, yra: 0, 1 ir 2 kartos. GC puikiai sugeba susigrąžinti valdomų objektų užimamą atmintį. Tačiau turėtumėte laikytis tam tikrų gairių, kad palengvintumėte greitesnį šiukšlių surinkimą ir pagerintumėte savo programos našumą.

Ar turėčiau naudoti GC.Collect () metodą?

Pirmiausia, ar jums apskritai reikia skambinti į GC. Surinkite savo programos kodą? Atsakymas daugeliu atvejų yra neigiamas. Leiskite man dabar pasakyti, ką daro šis metodas ir kodėl turėtumėte susilaikyti nuo šio metodo vadinimo daugeliu atvejų.

Kai skambinate į GC.Collect () metodą, vykdymo laikas vykdo rietuvės eigą, kad nustatytų pasiekiamus ir ne pasiekiamus objektus. Taip pat užšaldomas pagrindinis programos gija (ir visos jos sukurtos vaikiškos gijos). Kitaip tariant, kai iškviečiamas GC.Collect () metodas, vykdymo laikas atlieka blokuojamą visų kartų šiukšlių surinkimą.

Visada nenorėčiau naudoti GC.Collect (), nebent yra tam tikrų priežasčių naudoti. GC paprastai susideda iš žymėjimo ir valymo fazių, po kurių seka tankinimo fazė. Laikas, kurį vykdymo laikas praleido atlikdamas GC, gali tapti kliūtimi, todėl naudokite jį tik labai retai ir jei jums to tikrai reikia. Rico Mariani teigia: "Apsvarstykite galimybę paskambinti GC.Collect (), jei ką tik įvyko nepasikartojantis įvykis ir šis įvykis greičiausiai sukėlė daug senų objektų žūtį".

Naudojant GC.Collect () metodą

Štai kaip galite pasinaudoti GC.Collect () metodu savo kode.

GC.Collect ();

Atminkite, kad taip pat galite rinkti objektus, susijusius su konkrečia karta.

GC. Surinkite () - naudojami objektams, esantiems 0, 1, 2 kartose, rinkti

GC. Surinkite (0) - naudojami 0 kartos objektams rinkti

GC. Surinkite (1) - naudojami objektams, esantiems 0 ir 0 kartose, rinkti

Taip pat galite nustatyti, kiek atminties atlaisvinta, paskambinę į metodą GC.Collect (). Norėdami tai padaryti, galite pasinaudoti System.GC.GetTotalMemory () metodu, kaip parodyta žemiau esančiame kodo fragmente.

// Parašykite kodą, kad čia sukurtumėte didelius objektus

Console.WriteLine ("Visa laisva atmintis prieš surinkimą: {0: N0}", System.GC.GetTotalMemory (false));

System.GC.Collect ();

Console.WriteLine ("Visas laisvas atminties rinkinys: {0: N0}", System.GC.GetTotalMemory (true));

GC.GetGeneration () metodą galima naudoti kartai, kuriai priklauso objektas, žinoti. Žr. Toliau pateiktą kodų sąrašą.

static void Main (string [] args)

       {

Sąrašo obj = naujas sąrašas () {"Joydip", "Steve"};

Console.WriteLine (System.GC.GetGeneration (obj));

System.GC.Collect ();

Console.WriteLine (System.GC.GetGeneration (obj));

System.GC.Collect ();

Console.WriteLine (System.GC.GetGeneration (obj));

Pultas.Skaitykite ();

       }

Kai vykdote aukščiau nurodytą programą, štai kas atspausdinta konsolės lange.

0

1

2

Kaip matote, kiekvienas iškvietimas į GC.Collect () metodą reklamuoja objektą „obj“ kitai aukštesnei kartai. Taip yra todėl, kad objektas „obj“ išlieka už šiukšlių surinkimą kiekvienu iš dviejų atvejų, t. Y. Jis nėra susigrąžintas nė viename iš dviejų skambučių, atliktų GC.Collect () metodu.

Naudodami GC.Collect () metodą, galite priversti šiukšles rinkti visoms trims kartoms arba konkrečiai kartai. GC.Collect () metodas yra perkrautas - galite jį iškviesti be jokių parametrų ar net perduodami norimą kartos numerį šiukšlių surinkėjui surinkti.

Atminkite, kad objektai, turintys užbaigimo programą (ir jei nebuvo atliktas iškvietimas „SuppressFinalize“ metodui), nebus renkami, kai bus skambinama į GC.Collect () metodą. Greičiau tokie objektai būtų dedami į užbaigimo eilę. Jei norėtumėte surinkti ir tuos objektus, turėsite iškviesti metodą GC.WaitForPendingFinalizers (), kad šie objektai būtų išvalyti, kai paleidžiamas kitas GC ciklas. Iš esmės, norint susigrąžinti atmintį, kurią užima objektai, kuriuose įdiegti baigiamieji veiksniai, reikia dviejų leidimų, nes tokie objektai dedami į užbaigimo eilę, o ne išieškojami per pirmą kartą, kai veikia šiukšlių surinkėjas.