Ohjelmointi

Parhaat käytännöt roskien keruun helpottamiseksi .Netissä

Microsoft.Netissä roskien keräys on Common Language Runtime (CLR) -menetelmä, jonka avulla voit puhdistaa sovelluksesi kuluttamat resurssit. Kun luot objekteja .Netissä, ne tallennetaan hallittuun kasaan. Vaikka sinun on luotava esineitä, useimmissa tapauksissa sinun ei tarvitse olla huolissasi esineiden puhdistamisesta - ajoaika tekisi sen puolestasi.

Sinun tulisi kuitenkin soveltaa sovelluksessasi parhaita käytäntöjä roskien keräämisen helpottamiseksi ja resurssien puhdistamiseksi nopeammin. Vaikka .Net on taitava palauttamaan hallittuja objekteja, sinun tulee noudattaa tiettyjä ohjeita, jotta roskien kerääminen on nopeampaa sovelluksesi suorituskyvyn parantamiseksi. Tässä artikkelissa haluaisin esitellä keskustelun roskien keräyksen toiminnasta ja parhaista käytänteistä roskien keruun helpottamiseksi .Netissä.

Milloin roskat kerätään?

Roskat kerätään, kun järjestelmässä on vähän käytettävissä olevaa fyysistä muistia tai GC.Collect () menetelmää kutsutaan nimenomaisesti sovelluksesi koodissa. Objektit, joita ei enää käytetä tai joihin ei pääse juuresta, ovat ehdokkaita roskakoriin. Pohjimmiltaan roskien keräilijä puhdistaa muistin, joka on esineillä, joilla ei ole viitteitä.

Sukupolvet

Ajonaika organisoi hallitun kasan sukupolville. Se käyttää näitä sukupolvia lyhyt- ja pitkäikäisten esineiden järjestämiseen. On huomattava, että roskien keräilijä toimii paljon useammin alemmissa sukupolvissa kuin ylemmissä. Sukupolvi 0 sisältää lyhytaikaiset objektit, kuten väliaikaiset objektit. Kun objekti luodaan, se tallennetaan sukupolveen 0, ellei se ole suuri esine. Jos esine on suuri esine, se tallennetaan 2. objektin kasaan (LOH). Useimmissa tapauksissa roskankerääjä ottaa takaisin Generation 0 -objektit, kun se toimii taustalla.

Kun kirjoitat koodia, sinun on noudatettava tiettyjä parhaita käytäntöjä. Esimerkkinä sinun on luotava objekteja paikalliseen laajuuteen mahdollisimman paljon roskien keräämisen helpottamiseksi. Laajemmassa laajuudessa luodut objektit pysyvät yleensä muistissa pidempään. Voit hyödyntää CLR-profilointilaitetta ymmärtääksesi sovelluksesi allokointimallit.

Sinun tulisi välttää soittamista GC.Collect () menetelmä, koska se saa aikaan koko sukupolven kokoelman (sukupolvi 0, 1 ja 2). Kun soitat puhelimeen GC.Collect () menetelmä, ajonaika vierailee kaikissa sovelluksen live-objekteissa. Tämä vie paljon aikaa ja on siten erittäin kallis toimenpide. Tämän seurauksena ei ole hyvä käytäntö kutsua GC.Collect () menetelmä.

Jos joudut soittamaan GC.Collect () menetelmällä, sinun tulisi soittaa GC.WaitForPendingFinalizers () puhelun jälkeen GC.Collect () varmistaaksesi, että nykyinen suorituslanka odottaa kaikkien objektien viimeistelijöiden suorittamista.

Seuraavaksi sinun tulisi soittaa GC.Collect () menetelmällä uudelleen varmistaaksesi, että keräät jäljellä olevat kuolleet esineet. Nämä kuolleet objektit, jotka on voitu luoda objektien viimeistelijä-menetelmän kutsun vuoksi. Seuraava koodinpätkä osoittaa, miten näitä menetelmiä käytetään.

System.GC.Collect ();

System.GC.WaitForPendingFinalizers ();

System.GC.Collect ();

Sinun on varmistettava, että minimoit piilotetut varaukset ja kirjoitat koodisi siten, että mahdollisuudet lyhytaikaisten objektien mainostamiseen korkeampille sukupolville eliminoidaan. Sinun ei pitäisi viitata lyhytikäisiin esineisiin pitkäikäisistä, jotta vältetään lyhytikäisten esineiden mainostaminen korkeammille sukupolville.

Sinun tulisi myös välttää finalistien kirjoittamista luokkasi. Jos luokassasi on toteutettu viimeistelylaite, tällaisten luokkien kohteista tulisi pitkäikäisiä esineitä, koska ajonaikaisen on mainostettava viimeisteltäviä esineitä vanhemmille sukupolville. Objektit on asetettava nollaksi ennen pitkäaikaisen puhelun soittamista, jos sovellus ei tarvitse tällaisia ​​objekteja. Jos et enää tarvitse staattista objektia tai muita objekteja sovelluksessasi, sinun tulisi asettaa se nollaksi ennen pitkään käynnissä olevan puhelun soittamista. Sinun ei pitäisi asettaa paikallisia muuttujia nollaksi, koska sitä ei tarvita; ajonaika voi määrittää, mihin paikalliseen objektiin ei viitata koodissasi tai sitä ei käytetä enää, joten sinun ei tarvitse asettaa mitään paikallista muuttujaa nollaksi nimenomaisesti.