Programmering

Mine to cent på GC.Collect-metoden i C #

GC.Collect () -metoden har lenge vært populær blant .Net-utviklere. Imidlertid er det knapt få av oss som vet hvordan det faktisk fungerer, eller hvis det i det hele tatt er behov for en oppfordring til det.

CLR (Common Language Runtime) vedtar søppeloppsamling som en mekanisme for å rydde opp i ressursene som søknaden din bruker. Merk at når du oppretter objekter i .Net, lagres de i den administrerte dyngen, og når du er ferdig med å bruke dem, trenger du ikke bekymre deg for å rense dem - kjøretiden vil gjøre det for deg.

CLR organiserer den administrerte dyngen i generasjoner. De tre generasjonene som den administrerte dyngen er organisert i er: Generasjon 0, Generasjon 1 og Generasjon 2. GC er dyktig i å gjenvinne minnet okkupert av administrerte objekter. Du bør imidlertid følge visse retningslinjer for å lette raskere søppeloppsamling for å forbedre applikasjonens ytelse.

Bør jeg bruke GC.Collect () -metoden?

For det første, trenger du i det hele tatt å ringe GC.Collect in programmets kode? Svaret er i de fleste tilfeller nei. La meg nå fortelle deg hva denne metoden gjør, og hvorfor du i de fleste tilfeller bør avstå fra å kalle denne metoden.

Når du ringer til GC.Collect () -metoden, utfører kjøretiden en stakkgang for å bestemme objektene som er tilgjengelige og de som ikke er tilgjengelige. Det fryser også hovedtråden (og også eventuelle barnetråder den opprettet) i applikasjonen. Med andre ord, når GC.Collect () -metoden kalles, utfører kjøretiden en blokkerende søppelsamling av alle generasjoner.

Jeg foretrekker alltid å ikke bruke GC.Collect () med mindre det er en spesifikk grunn til å bruke den. En GC består vanligvis av Mark- og Sweep-fasene etterfulgt av en komprimeringsfase. Tiden brukt på kjøretiden for å utføre en GC kan bli en flaskehals, så bruk den bare veldig sjelden, og hvis du virkelig trenger det. Rico Mariani uttaler: "Vurder å ringe GC.Collect () hvis noen engangsbegivenhet nettopp har skjedd og denne hendelsen høyst sannsynlig har fått mange gamle gjenstander til å dø."

Ved hjelp av GC.Collect () -metoden

Slik kan du påberope GC.Collect () -metoden i koden din.

GC.Collect ();

Merk at du også kan samle gjenstander som gjelder en bestemt generasjon.

GC.Collect () - brukes til å samle gjenstander til stede i generasjonene 0, 1, 2

GC.Collect (0) - brukes til å samle gjenstander som er tilstede i generasjon 0

GC.Collect (1) - brukes til å samle gjenstander tilstede i generasjoner 0 og

Du kan også bestemme hvor mye minne som er frigjort ved å ringe til GC.Collect () -metoden. For å gjøre dette kan du dra nytte av metoden System.GC.GetTotalMemory () som vist i kodebiten nedenfor.

// Skriv kode for å lage noen store objekter her

Console.WriteLine ("Totalt tilgjengelig minne før samling: {0: N0}", System.GC.GetTotalMemory (false));

System.GC.Collect ();

Console.WriteLine ("Total tilgjengelig minnesamling: {0: N0}", System.GC.GetTotalMemory (true));

GC.GetGeneration () -metoden kan brukes til å vite generasjonen som et objekt tilhører. Se kodelisten nedenfor.

statisk tomrom Main (streng [] args)

       {

List obj = new List () {"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));

Console.Read ();

       }

Når du kjører programmet ovenfor, er det som er skrevet ut i konsollvinduet.

0

1

2

Som du kan se, fremmer hvert anrop til GC.Collect () -metoden objektet "obj" til neste høyere generasjon. Dette er fordi objektet "obj" overlever søppeloppsamlingen i hvert av de to tilfellene, dvs. at det ikke gjenvinnes i noen av de to samtalene som er gjort til GC.Collect () -metoden.

Du kan tvinge søppeloppsamling til alle de tre generasjonene eller til en bestemt generasjon ved hjelp av GC.Collect () -metoden. GC.Collect () -metoden er overbelastet - du kan ringe den uten parametere eller til og med ved å sende generasjonsnummeret du ønsker til søppeloppsamleren å samle inn.

Vær oppmerksom på at objekter som har sluttbehandler (og hvis en samtale til SuppressFinalize-metoden ikke har blitt gjort) ikke ville bli samlet inn når en samtale til GC.Collect () -metoden blir foretatt. Snarere vil slike gjenstander plasseres i sluttkøen. Hvis du også vil samle disse objektene, må du ringe til GC.WaitForPendingFinalizers () -metoden slik at disse objektene blir ryddet opp når neste GC-syklus kjører. I hovedsak krever gjenvinning av minnet okkupert av objekter som har ferdigbehandlere implementert to passeringer, siden slike objekter plasseres i sluttkøen i stedet for å bli gjenvunnet i første pass når søppeloppsamleren kjører.

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