Ohjelmointi

Kaksi senttiäni GC: ssä. Kerää menetelmä C #

GC.Collect () -menetelmä on pitkään ollut suosittu .Net-kehittäjien keskuudessa. Kuitenkin tuskin harvat meistä tietävät, miten se todella toimii, tai jos sitä tarvitaan ollenkaan.

CLR (Common Language Runtime) käyttää roskien keräystä mekanismina, joka puhdistaa sovelluksesi kuluttamat resurssit. Huomaa, että kun luot objekteja .Net-verkkoon, ne tallennetaan hallittuun kasaan, ja kun olet lopettanut niiden käytön, sinun ei tarvitse huolehtia niiden puhdistamisesta - ajonaikainen palvelu tekisi sen puolestasi.

CLR järjestää hallitun kasan sukupolville. Kolme sukupolvea, joihin hallittu kasa on organisoitu, ovat: Generation 0, Generation 1 ja Generation 2. GC osaa palauttaa hallittujen objektien käyttämän muistin. Noudata kuitenkin tiettyjä ohjeita helpottaaksesi roskien keräystä sovelluksesi suorituskyvyn parantamiseksi.

Pitäisikö minun käyttää GC.Collect () -menetelmää?

Ensinnäkin, onko sinun ollenkaan syytä soittaa GC: lle. Kerää sovelluksesi koodi? Vastaus on useimmissa tapauksissa ei. Haluan nyt kertoa sinulle, mitä tämä menetelmä tekee ja miksi sinun tulisi pidättäytyä kutsumasta tätä menetelmää useimmissa tapauksissa.

Kun soitat GC.Collect () -menetelmälle, ajonaikainen pino kävelee määrittämään tavoitettavat objektit ja ne, jotka eivät ole tavoitettavissa. Se myös pysäyttää sovelluksen päälangan (ja myös kaikki sen luomat alalanka). Toisin sanoen, kun GC.Collect () -menetelmää kutsutaan, ajonaika suorittaa kaikkien sukupolvien estävän roskakorin.

En halua aina käyttää GC.Collect (): aa, ellei ole erityistä syytä käyttää sitä. GC koostuu tyypillisesti Mark- ja Sweep-vaiheista, joita seuraa tiivistysvaihe. Ajon ajasta, joka suoritetaan GC: n suorittamiseen, voi tulla pullonkaula, joten käytä sitä vain hyvin harvoin ja jos todella tarvitset. Rico Mariani toteaa: "Harkitse soittamista GC.Collect (): een, jos jokin kertaluonteinen tapahtuma on juuri tapahtunut ja tämä tapahtuma on todennäköisesti aiheuttanut paljon vanhojen esineiden kuoleman."

Käyttämällä GC.Collect () -menetelmää

Näin voit kutsua GC.Collect () -menetelmän koodissasi.

GC.Collect ();

Huomaa, että voit myös kerätä tiettyä sukupolvea koskevia objekteja.

GC.Collect () - käytetään keräämään esineitä, jotka ovat läsnä sukupolvissa 0, 1, 2

GC-kokoelma (0) - käytetään keräämään esineitä, jotka ovat sukupolvessa 0

GC-kokoelma (1) - käytetään keräämään esineitä sukupolvesta 0 ja

Voit myös määrittää, kuinka paljon muistia on vapautettu soittamalla GC.Collect () -menetelmään. Voit tehdä tämän käyttämällä System.GC.GetTotalMemory () -menetelmää alla olevan koodinpätkän mukaisesti.

// Kirjoita koodi luodaksesi joitain suuria objekteja tähän

Console.WriteLine ("Käytettävissä oleva kokonaismuisti ennen keruuta: {0: N0}", System.GC.GetTotalMemory (false));

System.GC.Collect ();

Console.WriteLine ("Käytettävissä oleva koko muistikokoelma: {0: N0}", System.GC.GetTotalMemory (true));

GC.GetGeneration () -menetelmää voidaan käyttää sen sukupolven tuntemiseen, johon esine kuuluu. Katso alla annettu koodiluettelo.

staattinen void Main (merkkijono [] args)

       {

Lista obj = uusi Lista () {"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));

Konsoli.Lue ();

       }

Kun suoritat yllä olevan ohjelman, konsoli-ikkunaan tulostetaan tämä.

0

1

2

Kuten näette, kukin kutsu GC.Collect () -menetelmälle edistää objektia "obj" seuraavalle korkeammalle sukupolvelle. Tämä johtuu siitä, että objekti "obj" selviää roskakorista kummassakin tapauksessa, ts. Sitä ei palauteta missään kahdesta GC.Collect () -menetelmälle soitetusta kutsusta.

Voit pakottaa roskien keräämisen joko kaikille kolmelle sukupolvelle tai tietylle sukupolvelle GC.Collect () -menetelmän avulla. GC.Collect () -menetelmä on ylikuormitettu - voit soittaa sille ilman parametreja tai jopa välittämällä haluamasi sukupolven numeron roskien kerääjälle.

Huomaa, että objekteja, joilla on viimeistelijöitä (ja jos SuppressFinalize-menetelmää ei ole kutsuttu) ei kerätä, kun puhelu GC.Collect () -menetelmälle tehdään. Pikemminkin tällaiset objektit sijoitettaisiin viimeistelyjonoon. Jos haluat kerätä myös nämä objektit, sinun on soitettava GC.WaitForPendingFinalizers () -menetelmälle, jotta nämä objektit puhdistetaan, kun seuraava GC-sykli suoritetaan. Pohjimmiltaan sellaisten esineiden käyttämän muistin palauttaminen, joihin viimeistelijät on toteutettu, vaatii kaksi läpäisyä, koska tällaiset objektit sijoitetaan viimeistelyjonoon sen sijaan, että ne otettaisiin takaisin ensimmäisellä kierroksella, kun roskikorjaaja toimii.