Programování

Osvědčené postupy pro usnadnění sběru odpadků v .Net

V Microsoft.Net je uvolňování paměti mechanismus přijatý modulem Common Language Runtime (CLR) k vyčištění prostředků spotřebovaných vaší aplikací. Když vytváříte objekty v .Net, ukládají se do spravované hromady. I když potřebujete vytvářet objekty, ve většině případů se nemusíte starat o čištění objektů - běhové prostředí by to udělalo za vás.

Měli byste však ve své aplikaci přijmout osvědčené postupy, které usnadní úklid a pomohou rychleji vyčistit prostředky. Ačkoli .Net je zběhlý v získávání spravovaných objektů, měli byste dodržovat určité pokyny, které usnadní rychlejší uvolňování paměti a zlepší výkon vaší aplikace. V tomto článku bych chtěl představit diskusi o tom, jak funguje odvoz odpadu a osvědčené postupy pro usnadnění odvozu odpadu v .Net.

Kdy probíhá sběr odpadků?

Odpadky se odehrávají, když je v systému málo dostupné fyzické paměti nebo GC.Collect () metoda je v kódu vaší aplikace výslovně volána. Objekty, které se již nepoužívají nebo jsou nedostupné z kořenového adresáře, jsou kandidáty na uvolnění paměti. V podstatě garbage collector vyčistí paměť obsazenou objekty, které nemají žádné odkazy.

Generace

Modul runtime organizuje spravovanou hromadu do generací. Využívá tyto generace k organizaci objektů s krátkou a dlouhou životností. Je třeba poznamenat, že garbage collector pracuje mnohem častěji v nižších generacích než ve vyšších. Generace 0 obsahuje krátkodobé objekty, například dočasné objekty. Když je objekt vytvořen, je uložen v generaci 0, pokud nejde o velký objekt. Pokud je objekt velkým objektem, je uložen v haldě velkých objektů (LOH) v generaci 2. Ve většině případů jsou objekty generace 0 uvolňovány sběratelem odpadků, když běží na pozadí.

Při psaní kódu byste měli dodržovat určité osvědčené postupy. Jako příklad byste měli co nejvíce vytvářet objekty v místním oboru, abyste usnadnili odvoz odpadu. Objekty, které jsou vytvořeny ve vyšším rozsahu, se obvykle nacházejí v paměti po delší dobu. Můžete využít profileru CLR k pochopení alokačních vzorů vaší aplikace.

Měli byste se vyhnout volání GC.Collect () metoda, protože způsobí úplnou sbírku všech generací (generace 0, 1 a 2). Když voláte na GC.Collect () metoda, modul runtime navštíví všechny živé objekty ve vaší aplikaci. To zabere značné množství času, a proto je to velmi nákladná operace. Výsledkem je, že není dobrým zvykem volat GC.Collect () metoda.

Pokud musíte zavolat na GC.Collect () měli byste zavolat GC.WaitForPendingFinalizers () po volání na GC.Collect () zajistit, aby aktuální provádějící vlákno počkalo, dokud nebudou provedeny finalizátory pro všechny objekty.

Dále byste měli zavolat na GC.Collect () znovu, abyste zajistili, že budete sbírat mrtvé objekty, které zůstanou. Tyto mrtvé objekty, které mohly být vytvořeny kvůli volání metody finalizátoru na objektech. Následující fragment kódu ukazuje, jak se tyto metody používají.

System.GC.Collect ();

System.GC.WaitForPendingFinalizers ();

System.GC.Collect ();

Měli byste se ujistit, že minimalizujete skrytá alokace a zapisujete svůj kód takovým způsobem, že jsou eliminovány šance na povýšení objektů s krátkou životností na vyšší generace. Neměli byste odkazovat na objekty s krátkou životností od těch s dlouhou životností, abyste se vyhnuli propagaci předmětů s krátkou životností na vyšší generace.

Měli byste se také vyhnout psaní finalizátorů pro vaše třídy. Pokud máte ve své třídě implementovaný finalizátor, objekty takových tříd by se staly objekty s dlouhou životností, protože běhové prostředí potřebuje k propagaci finalizovatelných objektů na starší generace. Před provedením dlouhodobého volání byste měli nastavit objekty na null, pokud aplikace takové objekty nepotřebuje. Pokud již ve své aplikaci nepotřebujete statický objekt nebo jiné objekty, měli byste jej před dlouhým spuštěním hovoru nastavit na null. Neměli byste nastavovat lokální proměnné na null, protože to není nutné; modul runtime může určit, na který místní objekt se ve vašem kódu neodkazuje nebo se dále nepoužívá, takže nemusíte explicitně nastavovat žádnou místní proměnnou na null.

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