In programmeertalen kan een object alleen variabel zijn tijdens zijn bestaan, na de instantiatie kan het niet worden gewijzigd. Dus dezelfde geheugencel kan niet worden toegewezen aan nieuwe waarden, dus is een soort geautomatiseerd geheugenbeheer nodig om de ongebruikte ruimtes te beheren. Deze ongebruikte spaties worden rommel genoemd en het hele proces van efficiënt geheugenbeheer wordt garbage collection genoemd.
Het hoofddoel van een garbage collector is om de dode objecten van de levende objecten te scheiden en de ruimte terug te halen voor hergebruik. Kortom, het hele ding werkt op managed heap, wat niets anders is dan een geheugenblok en de garbage collector controleert periodiek het heap-geheugen om geheugen toe te wijzen aan nieuwe objecten. Er zijn twee methoden om onbeheerde bronnen zoals bestanden en databaseverbindingen vrij te geven: Dispose en Finalize.
Dit artikel helpt u het verschil tussen beide te begrijpen.
Dispose is een standaardmanier voor gebruikers om objecten te vertellen dat ze hun bronnen moeten vrijgeven en niet om opnieuw toegang tot de objecten te krijgen. De dispose-methode biedt controle over het opschonen van expliciet geheugen door de objecten onbruikbaar te maken.
Wanneer de gebruiker de methode Dispose () aanroept, moet het object al zijn dure bronnen vrijmaken en beschikbaar maken voor hergebruik. Het wordt nooit aangeroepen door de garbage collector die alleen maar komt spelen als het beheerde geheugen schaars wordt. Een speciale interface genaamd "IDisposable" wordt gebruikt om te beslissen waar en hoe Dispose () moet worden geïmplementeerd. Maar wat gebeurt er als de verwijderingsmethode niet wordt aangeroepen?
Als de verwijderingsmethode niet wordt aangeroepen, is het noodplan om de methode Finalize () te gebruiken voor opschoning. Het wordt door de garbage collector aangeroepen om een laatste resourceopruiming uit te voeren voordat het geheugen wordt vrijgegeven. Het concept van tijdige opruiming wordt hier niet toegepast, omdat in plaats van het onmiddellijk opnieuw toewijzen van het geheugen, het object wordt toegevoegd aan de finalisatiewachtrij om later te worden vernietigd. Finaliseren lijkt meer op een beveiliging die is ingesteld in het geval van een programmeerfout en de dispose ruimt niet de resources op. In dat geval wordt de methode Finalize () door de garbagecollector aangeroepen om onbereikbare objecten in een willekeurige volgorde te verwijderen.
Dispose-methode wordt gebruikt om de vrijgave van niet-beheerde bronnen, zoals databasehandgrepen, bestandshandleidingen, semaforen en andere door het besturingssysteem toegewezen objecten te versnellen. De dispose-methode wordt aangeroepen om code uit te voeren die nodig is om ongebruikt geheugen en schaarse bronnen zoals GDI-handles op te ruimen. In eenvoudige bewoordingen biedt dispose-methode controle over het expliciet opschonen van het geheugen. De methode Finalize maakt deel uit van de garbagecollection die wordt gebruikt om de laatste opschoonbewerking voor een object uit te voeren voordat het vuilnis wordt verzameld. Simpel gezegd, finalize methode wordt aangeroepen om onbeheerde bronnen vrij te maken die door een object worden vastgehouden voordat het wordt vernietigd.
Dispose methode kan expliciet worden aangeroepen door de gebruikerscode en de klasse die de methode implementeert om resources te verwijderen. Het geheugen kan echter pas vrijgegeven worden als de vuilnisman het opruimproces uitvoert. De methode kan worden gebruikt, zelfs als er nog andere verwijzingen naar het object bestaan. De laatste methode daarentegen kan alleen door de garbage collector worden aangeroepen nadat wordt vastgesteld dat het laatste exemplaar van het geheugenobject is vernietigd en er geen verwijzingen meer naar het object bestaan. Nadat de finalisatiemethode is uitgevoerd, wordt het object uit het heap-geheugen verwijderd.
Het proces waarbij een object uit het geheugen wordt verwijderd, wordt het dispose-patroon genoemd, dat kan worden gebruikt voor objecten die onbeheerde bronnen benaderen omdat de garbage collector niet-beheerde bronnen kan terugvorderen. De "IDisposable" -interface samen met een extra Dispose (Boolean) -methode wordt geïmplementeerd met het verzoek om de vrijgave van onbeheerde bronnen. Een finalisatiemethode wordt uitgevoerd wanneer de instantie van een object wordt vernietigd voorafgaand aan de deallocatie. Het is een niet-deterministische methode die ter discretie van de garbage collector plaatsvindt en mogelijk zelfs niet voorkomt. Het moet niet worden geïmplementeerd op beheerde objecten tot het uiterst noodzakelijk is.
Het is veel sneller om een verwijderingsmethode te gebruiken in plaats van te finaliseren voor het direct weggooien van objecten. Destructors worden tijdens runtime automatisch geconverteerd naar de laatste methode. Het wordt automatisch aangeroepen door de garbage collector wanneer het object buiten het bereik valt, wat meestal gebeurt wanneer de instantie van dat object wordt vernietigd. Het probleem met de finalisatiemethode is dat het niet-deterministisch betekent dat het niet zeker is wanneer geheugen moet worden teruggevorderd waarnaar niet meer wordt verwezen door garbage collection. Het geheugen wordt echter mogelijk niet onmiddellijk vrijgegeven; in feite kan het nooit worden geroepen en kan het niet expliciet worden gedwongen.
Het belangrijkste verschil tussen dispose- en finalize-methoden is dat de eerste een deterministische methode is die objecten onmiddellijk verwijdert wanneer ze niet langer worden gebruikt, terwijl de laatste een niet-deterministische methode is voor het toewijzen van niet-beheerde bronnen, wat betekent dat het een backstop-methode is om vrij te maken geheugenobjecten wanneer deze buiten de scope vallen voorafgaand aan hun deallocatie. Het is altijd aan te raden om de verwijderingsmethode te gebruiken om te voltooien, tenzij dit uiterst noodzakelijk is.
Met andere woorden, finaliseren is een beveiliging die is ingesteld om niet-beheerde bronnen op te schonen wanneer de verwijderingsmethode niet kan worden aangeroepen in het geval van een programmeerfout. De methode Finalize wordt door de garbage collector aangeroepen wanneer een object op het punt staat uit het heap-geheugen te worden getrapt.