System.GC-klasse
In dit artikel vindt u aanvullende opmerkingen in de referentiedocumentatie voor deze API.
De GC klasse bepaalt de garbagecollector. De garbagecollector is een algemeen taalruntime-onderdeel dat de toewijzing en release van beheerd geheugen beheert. De methoden in deze klasse beïnvloeden wanneer garbagecollection wordt uitgevoerd op een object en wanneer resources die door een object zijn toegewezen, worden vrijgegeven. Eigenschappen in deze klasse bevatten informatie over de totale hoeveelheid geheugen die beschikbaar is in het systeem en de leeftijdscategorie of generatie van geheugen die aan een object is toegewezen.
De garbagecollector houdt objecten bij die zijn toegewezen in beheerd geheugen en maakt ze vrij. Periodiek voert de garbagecollector garbagecollection uit om geheugen vrij te maken dat is toegewezen aan objecten waarvoor geen geldige verwijzingen zijn. Garbagecollection gebeurt automatisch wanneer een aanvraag voor geheugen niet kan worden voldaan met het beschikbare vrije geheugen. Een toepassing kan ook garbagecollection afdwingen met behulp van de Collect methode.
Garbagecollection bestaat uit de volgende stappen:
- De garbagecollector zoekt naar beheerde objecten waarnaar wordt verwezen in beheerde code.
- De garbagecollector probeert objecten te voltooien waarnaar niet wordt verwezen.
- De garbagecollector maakt objecten vrij waarnaar niet wordt verwezen en maakt hun geheugen vrij.
Onbeheerde resources
Tijdens een verzameling maakt de garbagecollection een object niet vrij als er een of meer verwijzingen naar het object in beheerde code worden gevonden. De garbagecollector herkent echter geen verwijzingen naar een object uit onbeheerde code en kan objecten vrij maken die uitsluitend in onbeheerde code worden gebruikt, tenzij dit expliciet wordt voorkomen. De KeepAlive methode biedt een mechanisme waarmee wordt voorkomen dat de garbagecollector objecten verzamelt die nog steeds in gebruik zijn in onbeheerde code.
Afgezien van beheerde geheugentoewijzingen onderhouden implementaties van de garbagecollector geen informatie over resources die door een object worden bewaard, zoals bestandsingangen of databaseverbindingen. Wanneer een type onbeheerde resources gebruikt die moeten worden vrijgegeven voordat exemplaren van het type worden vrijgemaakt, kan het type een finalizer implementeren.
In de meeste gevallen worden finalizers geïmplementeerd door de Object.Finalize methode te overschrijven, maar typen die zijn geschreven in C# of C++ implementeren destructors, die compilers omzetten in een onderdrukking van Object.Finalize. In de meeste gevallen, als een object een finalizer heeft, roept de garbagecollector het aan voordat het object wordt vrijgemaakt. De garbagecollector is echter niet vereist om finalizers in alle situaties aan te roepen; De SuppressFinalize methode voorkomt bijvoorbeeld expliciet dat de finalizer van een object wordt aangeroepen. Bovendien is de garbagecollector niet vereist om een specifieke thread te gebruiken om objecten te voltooien of de volgorde te garanderen waarin finalizers worden aangeroepen voor objecten die naar elkaar verwijzen, maar die anders beschikbaar zijn voor garbagecollection.
In scenario's waarin resources op een bepaald tijdstip moeten worden vrijgegeven, kunnen klassen de IDisposable interface implementeren, die de IDisposable.Dispose methode bevat waarmee resourcebeheer- en opschoontaken worden uitgevoerd. Klassen die worden geïmplementeerd Dispose , moeten, als onderdeel van hun klassecontract, opgeven of en wanneer klassegebruikers de methode aanroepen om het object op te schonen. De garbagecollector roept standaard de Dispose methode niet aan. Implementaties van de Dispose methode kunnen echter methoden in de GC klasse aanroepen om het uiteindelijke gedrag van de garbagecollector aan te passen.
Zie Opschonen van niet-beheerde resources voor meer informatie over het voltooien van objecten en het verwijderingspatroon.
Objectveroudering en generaties
De garbagecollector in de algemene taalruntime ondersteunt objectveroudering met behulp van generaties. Een generatie is een maateenheid van de relatieve leeftijd van objecten in het geheugen. Het generatienummer of de leeftijd van een object geeft de generatie aan waartoe een object behoort. Objecten die onlangs zijn gemaakt, maken deel uit van nieuwere generaties en hebben lagere generatienummers dan objecten die eerder in de levenscyclus van de toepassing zijn gemaakt. Objecten in de meest recente generatie zijn in generatie 0. Deze implementatie van de garbagecollection ondersteunt drie generaties objecten, generaties 0, 1 en 2. U kunt de waarde van de MaxGeneration eigenschap ophalen om het maximale generatienummer te bepalen dat door het systeem wordt ondersteund.
Met objectveroudering kunnen toepassingen zich richten op garbagecollection op een specifieke set generaties in plaats van dat de garbagecollector alle generaties moet evalueren. Overbelastingen van de Collect methode die een generation
parameter bevatten, kunt u de oudste generatie opgeven die als garbagecollection moet worden verzameld.
Toewijzing van garbagecollection ongedaan maken
De garbagecollector ondersteunt een GC-regiolatentiemodus die kan worden gebruikt tijdens het uitvoeren van kritieke paden waarin garbagecollection de prestaties van een app nadelig kan beïnvloeden. Voor de modus voor latentie van de GC-regio is vereist dat u een hoeveelheid geheugen opgeeft die zonder interferentie van de garbagecollection kan worden toegewezen. Als de runtime dat geheugen kan toewijzen, voert de runtime geen garbagecollection uit terwijl code in het kritieke pad wordt uitgevoerd.
U definieert het begin van het kritieke pad van de geen GC-regio door een van de overbelastingen van de TryStartNoGCRegion. U geeft het einde van het kritieke pad op door de EndNoGCRegion methode aan te roepen.
U kunt geen aanroepen naar de TryStartNoGCRegion methode nesten en u moet de EndNoGCRegion methode alleen aanroepen als de runtime zich momenteel in de modus GC-regiolatentie bevindt. Met andere woorden, u moet niet meerdere keren aanroepen TryStartNoGCRegion (na de eerste methodeaanroep, volgende aanroepen zullen niet slagen) en u mag niet verwachten dat aanroepen EndNoGCRegion slagen, alleen omdat de eerste aanroep is TryStartNoGCRegion geslaagd.