Vodič za prikupljanje smeća u programiranju

Što je odvoz smeća?

Općenito govoreći, skupljanje smeća (GC) nije ništa drugo nego prikupljanje ili vraćanje memorije koja je dodijeljena objektima, ali koja se trenutno ne koristi ni u jednom dijelu našeg programa.

Uđimo u detalje. Skupljanje smeća je postupak u kojem programi pokušavaju osloboditi memorijski prostor koji više ne koriste objekti.

Odvoz smeća različito se primjenjuje za svaki jezik. Većina programskih jezika visoke razine ugrađuje neku vrstu odvoza smeća. Programski jezici niske razine mogu dodavati odvoz smeća putem knjižnica.

Kao što je gore rečeno, svaki programski jezik ima svoj način izvođenja GC-a. U programiranju na C, programeri moraju voditi računa o dodjeli i uklanjanju memorije pomoću funkcija malloc () i dealloc (). Ali, u slučaju C # programeri ne trebaju brinuti o GC-u, a to se također ne preporučuje.

Kako se događa dodjela memorije?

U C #, dodjeljivanje memorije objekata događa se u upravljanoj hrpi, o čemu se brine CLR (uobičajeno vrijeme izvođenja). Dodjela memorije za hrpu vrši se kroz win32 dll u OS-u i slično u C.

Ali, u C objekti se stavljaju u memoriju gdje god ima slobodnog prostora koji odgovara veličini predmeta. Također, mapiranje memorije djeluje na temelju koncepata Linkedlist. U C #, dodjela memorije za hrpu događa se linearno, jedno za drugim.

Kad god se stvara novi objekt, memorija se dodjeljuje u hrpu i pokazivač se premješta na sljedeću memorijsku adresu. Dodjeljivanje memorije u C # brže je nego u C. To je zato što u C memorija treba tražiti i dodijeliti objekt. Dakle, trebat će malo više vremena od C #.

Generacije u C # GC

U .net programiranju hrpa ima tri generacije koje se nazivaju generacije 0, 1 i 2. Generacija 0 ispunjava se prva kad god se stvori novi objekt. Tada se skupljač smeća pokreće kad se generacija 0 napuni. Novostvoreni objekti smještaju se u generaciju 0.

Tijekom izvođenja smeća svi neželjeni predmeti se uništavaju, a memorija se oslobađa i sabija. GC se brine za usmjeravanje pokazivača oslobođene memorije kada se dogodi GC.

Generacije 1 i 2 sadrže predmete koji imaju duži vijek trajanja. GC na generacijama 1 i 2 neće se dogoditi dok generacije 0 ne dobiju dovoljno memorije za raspodjelu.

Ne biste se trebali pozivati ​​na GC programski. Dobro je pustiti da se to dogodi samo od sebe. GC dobiva poziv kad god se popuni generacija 0.

Prednosti i nedostaci GC-a

Odvoz smeća je alat koji programerima štedi vrijeme. Na primjer, zamjenjuje potrebu za funkcijama poput malloc () i free () koje se nalaze u C. Također može pomoći u sprečavanju curenja memorije.

Loša strana odvoza smeća je što negativno utječe na performanse. GC se mora redovito izvoditi kroz program, provjeravati reference objekata i čistiti memoriju. To zauzima resurse i često zahtijeva zaustavljanje programa.

Kada to učiniti

Ako objekt nema reference (više nije dostupan), onda ispunjava uvjete za odvoz smeća.

Na primjer, u donjem Java kodu, objekt Thing na koji se izvorno poziva 'thing1' ima svoju jedinu referencu preusmjerenu na drugi objekt na hrpi. To znači da je tada nedostupan i da će njegova memorija neraspoređivati ​​sakupljač smeća.

class Useless { public static void main (String[] args) { Thing thing1 = new Thing(); Thing thing2 = new Thing(); thing2 = thing1; // direct thing2's reference towards thing1 // no references access thing2 } }

Primjer odvoza smeća je ARC, skraćenica od automatskog brojanja referenci. To se, na primjer, koristi u Swiftu. ARC se svodi na praćenje referenci na sve stvorene objekte. Ako količina referenci padne na 0, objekt će biti označen za oslobađanje.

Više informacija:

  • //docs.microsoft.com/en-us/dotnet/standard/garbage-collection/fundamentals - Da biste saznali više o odvozu smeća