Programmēšana

Mani divi centi par GC. Kolekcijas metode C #

GC.Collect () metode jau ilgu laiku ir bijusi populāra .Net izstrādātāju vidū. Tomēr reti kurš no mums zina, kā tas faktiski darbojas, vai, ja tas vispār ir nepieciešams.

CLR (Common Language Runtime) pieņem atkritumu savākšanu kā mehānismu, lai attīrītu jūsu lietojumprogrammas patērētos resursus. Ņemiet vērā, ka, izveidojot objektus .Net, tie tiek saglabāti pārvaldītajā kaudzē, un, kad esat tos lietojis, jums nav jāuztraucas par to tīrīšanu - izpildlaiks to izdarītu jūsu vietā.

CLR organizē pārvaldīto kaudzi paaudzēs. Trīs paaudzes, kurās tiek organizēts pārvaldītais kaudze, ir: 0., 1. un 2. paaudze. GC ir prasmīga, lai atgūtu pārvaldīto objektu aizņemto atmiņu. Tomēr jums jāievēro noteiktas vadlīnijas, lai veicinātu ātrāku atkritumu savākšanu, lai uzlabotu lietojumprogrammas veiktspēju.

Vai man vajadzētu izmantot metodi GC.Collect ()?

Pirmkārt, vai jums vispār ir jāzvana GC. Ievadiet savas lietojumprogrammas kodu? Atbilde vairumā gadījumu ir nē. Ļaujiet man tagad pastāstīt, ko šī metode dara, un kāpēc jums vairumā gadījumu vajadzētu atturēties no šīs metodes izsaukšanas.

Veicot zvanu uz GC.Collect () metodi, izpildlaiks veic kaudzes gājienu, lai noteiktu objektus, kas ir sasniedzami, un tos, kuri nav. Tas arī iesaldē lietojumprogrammas galveno pavedienu (un arī visus tā izveidotos bērnu pavedienus). Citiem vārdiem sakot, kad tiek izsaukta metode GC.Collect (), izpildlaiks veic visu paaudžu atkritumu savākšanas bloķēšanu.

Es vienmēr gribētu neizmantot GC. Collect (), ja vien nav īpaša iemesla to izmantot. GC parasti sastāv no atzīmēšanas un slaucīšanas fāzēm, kam seko blīvēšanas fāze. Laiks, ko izpildes laiks pavada GC veikšanai, var kļūt par sašaurinājumu, tāpēc izmantojiet to tikai ļoti reti un, ja jums tas tiešām ir nepieciešams. Rico Mariani norāda: "Apsveriet iespēju piezvanīt uz GC.Collect (), ja tikko ir noticis kāds neatkārtots notikums, un šis notikums, visticamāk, ir izraisījis daudzu vecu objektu nāvi."

Izmantojot metodi GC.Collect ()

Lūk, kā jūs varat izsaukt GC.Collect () metodi savā kodā.

GC.Collect ();

Ņemiet vērā, ka varat arī savākt objektus, kas attiecas uz noteiktu paaudzi.

GC. Kolekcija () - izmanto, lai savāktu objektus, kas atrodas paaudzēs 0, 1, 2

GC. Kolekcija (0) - izmanto, lai savāktu objektus, kas atrodas 0 paaudzē

GC. Kolekcija (1) - izmanto, lai savāktu objektus, kas atrodas 0

Varat arī noteikt, cik daudz atmiņas ir atbrīvots, veicot zvanu uz metodi GC.Collect (). Lai to izdarītu, varat izmantot System.GC.GetTotalMemory () metodes priekšrocības, kā parādīts zemāk esošajā koda fragmentā.

// Uzrakstiet kodu, lai šeit izveidotu dažus lielus objektus

Console.WriteLine ("Kopējā pieejamā atmiņa pirms kolekcijas: {0: N0}", System.GC.GetTotalMemory (false));

System.GC.Collect ();

Console.WriteLine ("Kopējā pieejamā atmiņas kolekcija: {0: N0}", System.GC.GetTotalMemory (true));

Lai uzzinātu paaudzi, kurai pieder objekts, var izmantot metodi GC.GetGeneration (). Skatiet kodu sarakstu, kas norādīts zemāk.

static void Main (virkne [] 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));

Konsole. Lasīt ();

       }

Izpildot iepriekš minēto programmu, konsoles logā tiek drukāts tālāk.

0

1

2

Kā redzat, katrs zvans uz metodi GC.Collect () veicina objekta "obj" nākamo augstāko paaudzi. Tas ir tāpēc, ka objekts "obj" pārdzīvo atkritumu savākšanu katrā no abiem gadījumiem, t.i., tas netiek atgūts nevienā no diviem zvaniem, kas veikti, izmantojot metodi GC.Collect ().

Izmantojot GC.Collect () metodi, jūs varat piespiest atkritumu savākšanu visām trim paaudzēm vai noteiktai paaudzei. GC.Collect () metode ir pārslogota - jūs varat to izsaukt bez parametriem vai pat nododot vēlamo paaudzes numuru atkritumu savācējam savākt.

Ņemiet vērā, ka objekti, kuriem ir pabeigšanas ierīces (un ja nav veikts izsaukums uz metodi SuppressFinalize), netiktu apkopoti, veicot zvanu uz metodi GC.Collect (). Drīzāk šādi objekti tiktu ievietoti pabeigšanas rindā. Ja vēlaties savākt arī šos objektus, jums jāsazvana uz metodi GC.WaitForPendingFinalizers (), lai šie objekti tiktu notīrīti, kad tiek palaists nākamais GC cikls. Būtībā, lai atgūtu atmiņu, ko aizņem objekti, kuriem ir ieviesti pabeigšanas rīki, nepieciešamas divas caurlaides, jo šādi objekti tiek ievietoti pabeigšanas rindā, nevis tiek atgūti pirmajā piegājienā, kad darbojas atkritumu savācējs.

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