Programovanie

Najlepšie postupy na uľahčenie zberu odpadu v sieti .Net

V Microsoft.Net je zhromažďovanie odpadu mechanizmus prijatý jazykom CLR (Common Language Runtime) na vyčistenie prostriedkov spotrebovaných vašou aplikáciou. Keď vytvárate objekty v .Net, ukladajú sa do spravovanej haldy. Aj keď potrebujete vytvárať objekty, vo väčšine prípadov sa nemusíte obávať ich vyčistenia - runtime by to urobil za vás.

Mali by ste však vo svojej aplikácii prijať osvedčené postupy, ktoré uľahčia zber odpadkov a pomôžu mu rýchlejšie vyčistiť zdroje. Aj keď je .Net zručný v získavaní späť spravovaných objektov, mali by ste postupovať podľa určitých pokynov, aby ste uľahčili rýchlejší zber odpadu a zlepšili výkon svojej aplikácie. V tomto článku by som chcel predstaviť diskusiu o tom, ako funguje zhromažďovanie odpadkov, a osvedčených postupoch, ktoré uľahčujú zber odpadkov v sieti .Net.

Kedy sa koná odvoz smetí?

Odpadky sa zbierajú, keď má systém málo dostupnej fyzickej pamäte alebo GC.Collect () metóda je explicitne volaná v kóde vašej aplikácie. Objekty, ktoré sa už nepoužívajú alebo sú nedostupné z koreňa, sú kandidátmi na zber odpadu. Smetiar v podstate vyčistí pamäť obsadenú objektmi, ktoré nemajú odkazy.

Generácií

Modul runtime organizuje spravovanú hromadu do generácií. Využíva tieto generácie na organizáciu objektov s krátkym a dlhým polčasom rozpadu. Je potrebné poznamenať, že zberač odpadu pracuje oveľa častejšie v nižších generáciách ako vo vyšších. Generácia 0 obsahuje krátkodobé objekty, napríklad dočasné objekty. Keď je objekt vytvorený, je uložený v generácii 0, pokiaľ nejde o veľký objekt. Ak je objekt veľkým objektom, uloží sa do hromady veľkých objektov (LOH) v generácii 2. Vo väčšine prípadov objekty generácie 0 regeneruje zberač odpadkov, keď beží na pozadí.

Pri písaní kódu by ste mali dodržiavať určité osvedčené postupy. Napríklad by ste mali čo najviac vytvárať objekty v miestnom rozsahu, aby ste uľahčili zber odpadu. Objekty, ktoré sú vytvorené vo vyššom rozsahu, sa spravidla nachádzajú v pamäti dlhšiu dobu. Môžete využiť profilovač CLR na pochopenie alokačných vzorov vašej aplikácie.

Mali by ste sa vyhnúť volaniu na GC.Collect () metóda, pretože spôsobuje úplnú zbierku všetkých generácií (generácia 0, 1 a 2). Keď zavoláte na číslo GC.Collect () metódou, modul runtime navštívi všetky živé objekty vo vašej aplikácii. To trvá značné množstvo času, a preto je to veľmi nákladná operácia. Vo výsledku nie je dobrým zvykom volať GC.Collect () metóda.

Ak máte zavolať na GC.Collect () mali by ste zavolať GC.WaitForPendingFinalizers () po volaní na GC.Collect () aby sa zabezpečilo, že súčasné vykonávajúce vlákno počká, kým nebudú vykonané finalizátory pre všetky objekty.

Ďalej by ste mali zavolať na číslo GC.Collect () znova, aby ste zaistili, že budete zbierať mŕtve predmety, ktoré zostali. Tieto mŕtve objekty, ktoré mohli byť vytvorené v dôsledku volania metódy finalizátora na objektoch. Nasledujúci úryvok kódu ukazuje, ako sa tieto metódy používajú.

System.GC.Collect ();

System.GC.WaitForPendingFinalizers ();

System.GC.Collect ();

Mali by ste sa ubezpečiť, že minimalizujete skryté alokácie a napíšete kód tak, aby boli eliminované šance na povýšenie objektov s krátkou životnosťou na vyššie generácie. Nemali by ste odkazovať na objekty s krátkou životnosťou od objektov s dlhou životnosťou, aby ste sa vyhli propagácii predmetov s krátkou životnosťou na vyššie generácie.

Mali by ste sa tiež vyhnúť tomu, aby ste pre svoje triedy písali finalizátory. Ak máte vo svojej triede implementovaný finalizátor, objekty takýchto tried by sa stali objektmi s dlhou životnosťou, pretože runtime potrebuje na podporu finalizovateľných objektov pre staršie generácie. Pred uskutočnením dlhodobého hovoru by ste mali nastaviť objekty na null, ak tieto objekty aplikácia nepotrebuje. Ak už vo svojej aplikácii nepotrebujete statický objekt alebo iné objekty, mali by ste ho pred uskutočnením dlhodobého hovoru nastaviť na hodnotu null. Nemali by ste nastavovať lokálne premenné na hodnotu null, pretože to nie je potrebné; runtime môže určiť, na ktorý lokálny objekt sa vo vašom kóde neodkazuje alebo sa už viac nepoužíva, takže nemusíte explicitne nastavovať žiadnu lokálnu premennú na null.

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