GC Klas
Definitie
Belangrijk
Bepaalde informatie heeft betrekking op een voorlopige productversie die aanzienlijk kan worden gewijzigd voordat deze wordt uitgebracht. Microsoft biedt geen enkele expliciete of impliciete garanties met betrekking tot de informatie die hier wordt verstrekt.
Hiermee bepaalt u de garbagecollector van het systeem, een service die automatisch ongebruikt geheugen terugvordert.
public ref class GC abstract sealed
public ref class GC sealed
public static class GC
public sealed class GC
type GC = class
Public Class GC
Public NotInheritable Class GC
- Overname
-
GC
Voorbeelden
In het volgende voorbeeld worden verschillende GC-methoden gebruikt om informatie over het genereren en geheugen op te halen over een blok ongebruikte objecten en deze af te drukken naar de console. De ongebruikte objecten worden vervolgens verzameld en de resulterende geheugentotalen worden weergegeven.
using System;
namespace GCCollectIntExample
{
class MyGCCollectClass
{
private const long maxGarbage = 1000;
static void Main()
{
MyGCCollectClass myGCCol = new MyGCCollectClass();
// Determine the maximum number of generations the system
// garbage collector currently supports.
Console.WriteLine("The highest generation is {0}", GC.MaxGeneration);
myGCCol.MakeSomeGarbage();
// Determine which generation myGCCol object is stored in.
Console.WriteLine("Generation: {0}", GC.GetGeneration(myGCCol));
// Determine the best available approximation of the number
// of bytes currently allocated in managed memory.
Console.WriteLine("Total Memory: {0}", GC.GetTotalMemory(false));
// Perform a collection of generation 0 only.
GC.Collect(0);
// Determine which generation myGCCol object is stored in.
Console.WriteLine("Generation: {0}", GC.GetGeneration(myGCCol));
Console.WriteLine("Total Memory: {0}", GC.GetTotalMemory(false));
// Perform a collection of all generations up to and including 2.
GC.Collect(2);
// Determine which generation myGCCol object is stored in.
Console.WriteLine("Generation: {0}", GC.GetGeneration(myGCCol));
Console.WriteLine("Total Memory: {0}", GC.GetTotalMemory(false));
Console.Read();
}
void MakeSomeGarbage()
{
Version vt;
for(int i = 0; i < maxGarbage; i++)
{
// Create objects and release them to fill up memory
// with unused objects.
vt = new Version();
}
}
}
}
open System
let maxGarbage = 1000
type MyGCCollectClass() =
member _.MakeSomeGarbage() =
for _ = 1 to maxGarbage do
// Create objects and release them to fill up memory with unused objects.
Version() |> ignore
[<EntryPoint>]
let main _ =
let myGCCol = MyGCCollectClass()
// Determine the maximum number of generations the system
// garbage collector currently supports.
printfn $"The highest generation is {GC.MaxGeneration}"
myGCCol.MakeSomeGarbage()
// Determine which generation myGCCol object is stored in.
printfn $"Generation: {GC.GetGeneration myGCCol}"
// Determine the best available approximation of the number
// of bytes currently allocated in managed memory.
printfn $"Total Memory: {GC.GetTotalMemory false}"
// Perform a collection of generation 0 only.
GC.Collect 0
// Determine which generation myGCCol object is stored in.
printfn $"Generation: {GC.GetGeneration myGCCol}"
printfn $"Total Memory: {GC.GetTotalMemory false}"
// Perform a collection of all generations up to and including 2.
GC.Collect 2
// Determine which generation myGCCol object is stored in.
printfn $"Generation: {GC.GetGeneration myGCCol}"
printfn $"Total Memory: {GC.GetTotalMemory false}"
0
Namespace GCCollectInt_Example
Class MyGCCollectClass
Private maxGarbage As Long = 10000
Public Shared Sub Main()
Dim myGCCol As New MyGCCollectClass
'Determine the maximum number of generations the system
'garbage collector currently supports.
Console.WriteLine("The highest generation is {0}", GC.MaxGeneration)
myGCCol.MakeSomeGarbage()
'Determine which generation myGCCol object is stored in.
Console.WriteLine("Generation: {0}", GC.GetGeneration(myGCCol))
'Determine the best available approximation of the number
'of bytes currently allocated in managed memory.
Console.WriteLine("Total Memory: {0}", GC.GetTotalMemory(False))
'Perform a collection of generation 0 only.
GC.Collect(0)
'Determine which generation myGCCol object is stored in.
Console.WriteLine("Generation: {0}", GC.GetGeneration(myGCCol))
Console.WriteLine("Total Memory: {0}", GC.GetTotalMemory(False))
'Perform a collection of all generations up to and including 2.
GC.Collect(2)
'Determine which generation myGCCol object is stored in.
Console.WriteLine("Generation: {0}", GC.GetGeneration(myGCCol))
Console.WriteLine("Total Memory: {0}", GC.GetTotalMemory(False))
Console.Read()
End Sub
Sub MakeSomeGarbage()
Dim vt As Version
Dim i As Integer
For i = 0 To maxGarbage - 1
'Create objects and release them to fill up memory
'with unused objects.
vt = New Version
Next i
End Sub
End Class
End Namespace
Opmerkingen
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 vuilnisverzameling wordt uitgevoerd op een object en wanneer de door een object toegewezen hulpbronnen 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 vuilnisophaler geheugenbeheer uit om geheugen terug te winnen dat is toegewezen aan objecten waarvoor geen geldige verwijzingen meer bestaan. Geheugenopruiming wordt automatisch uitgevoerd wanneer een geheugenaanvraag niet kan worden voorzien met het beschikbare 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 vuilnisverzamelaar verwijdert objecten die niet meer worden gebruikt en herwint hun geheugen.
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 niet-beheerde resources gebruikt die moeten worden vrijgegeven voordat exemplaren van het type worden opgehaald, kan het type een finalizer implementeren.
In de meeste gevallen worden finalizers geïmplementeerd door de Object.Finalize-methode te overschrijven; echter, typen die zijn geschreven in C# of C++ implementeren destructors, die compilers omzetten in een overschrijving van Object.Finalize. In de meeste gevallen, als een object een finalizer heeft, roept de garbagecollector het aan voordat het object wordt vrijgemaakt. De garbage collector is echter niet verplicht om finalizers in alle situaties aan te roepen; de SuppressFinalize-methode voorkomt bijvoorbeeld expliciet dat de finalizer van een object wordt aangeroepen. Bovendien is het voor de garbagecollector niet verplicht om een specifieke thread te gebruiken om objecten af te handelen, of om de volgorde te garanderen waarin finalizers worden aangeroepen voor objecten die naar elkaar verwijzen, maar die anders beschikbaar zijn voor garbage collection.
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 Dispose implementeren, moeten als onderdeel van hun klassecontract opgeven of en wanneer gebruikers van de klasse de methode aanroepen om het object op te ruimen. 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 vuilnisophaling 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 vuilnisophaling voor een specifieke set generaties in plaats van dat de vuilnisophaler alle generaties moet evalueren. Overbelastingen van de Collect-methode met een generation-parameter stellen u in staat om de oudste generatie te specificeren voor garbage collection.
Garbage collection uitschakelen
De geheugenbeheerder ondersteunt een geen-GC-regio latentiemodus die kan worden gebruikt tijdens de uitvoering van kritieke trajecten waarin het verzamelen van afval de prestaties van een app nadelig kan beïnvloeden. Voor de geen GC-regio latentiemodus moet u een hoeveelheid geheugen opgeven die zonder interferentie van de garbagecollector kan worden toegewezen. Als de runtime dat geheugen kan toewijzen, voert de runtime geen garbage-collection uit terwijl de 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 mag de EndNoGCRegion methode alleen aanroepen als de runtime zich momenteel in de modus met geen GC-regio latentie 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.
Eigenschappen
| Name | Description |
|---|---|
| MaxGeneration |
Hiermee haalt u het maximum aantal generaties op dat het systeem momenteel ondersteunt. |
Methoden
| Name | Description |
|---|---|
| AddMemoryPressure(Int64) |
Informeert de runtime van een grote toewijzing van onbeheerd geheugen waarmee rekening moet worden gehouden bij het plannen van garbagecollection. |
| AllocateArray<T>(Int32, Boolean) |
Wijst een matrix toe. |
| AllocateUninitializedArray<T>(Int32, Boolean) |
Wijst een matrix toe tijdens het overslaan van nul-initialisatie, indien mogelijk. |
| CancelFullGCNotification() |
Hiermee wordt de registratie van een garbagecollectionmelding geannuleerd. |
| Collect() |
Dwingt een onmiddellijke garbagecollection van alle generaties. |
| Collect(Int32, GCCollectionMode, Boolean, Boolean) |
Dwingt een garbagecollection af van generatie 0 tot en met een opgegeven generatie, op een moment dat is opgegeven door een GCCollectionMode waarde, met waarden die aangeven of de verzameling moet worden geblokkeerd en gecomprimeerd. |
| Collect(Int32, GCCollectionMode, Boolean) |
Dwingt een garbagecollection van generatie 0 tot en met een opgegeven generatie af, op een tijdstip dat is opgegeven door een GCCollectionMode waarde, met een waarde die aangeeft of de verzameling moet worden geblokkeerd. |
| Collect(Int32, GCCollectionMode) |
Dwingt een garbagecollection van generatie 0 tot en met een opgegeven generatie af, op een tijdstip dat is opgegeven door een GCCollectionMode waarde. |
| Collect(Int32) |
Dwingt een onmiddellijke garbagecollection van generatie 0 tot en met een opgegeven generatie. |
| CollectionCount(Int32) |
Retourneert het aantal keren dat garbagecollection heeft plaatsgevonden voor de opgegeven generatie van objecten. |
| EndNoGCRegion() |
Hiermee wordt de modus geen GC-regiolatentie beëindigd. |
| GetAllocatedBytesForCurrentThread() |
Hiermee wordt het totale aantal bytes opgehaald dat is toegewezen aan de huidige thread sinds het begin van de levensduur. |
| GetConfigurationVariables() |
Hiermee haalt u de configuraties op die door de garbagecollector worden gebruikt. |
| GetGCMemoryInfo() |
Hiermee haalt u geheugengegevens over garbagecollection op. |
| GetGCMemoryInfo(GCKind) |
Hiermee haalt u geheugengegevens over garbagecollection op. |
| GetGeneration(Object) |
Retourneert het huidige generatienummer van het opgegeven object. |
| GetGeneration(WeakReference) |
Retourneert het huidige generatienummer van het doel van een opgegeven zwakke verwijzing. |
| GetTotalAllocatedBytes(Boolean) |
Hiermee haalt u het aantal bytes op dat gedurende de levensduur van het proces is toegewezen. De geretourneerde waarde bevat geen systeemeigen toewijzingen. |
| GetTotalMemory(Boolean) |
Haalt de heapgrootte op, exclusief fragmentatie. Als de totale grootte van de GC-heap bijvoorbeeld 100 mb is en fragmentatie, dus ruimte die wordt gebruikt door vrije objecten, 40 mb in beslag neemt, rapporteert deze API 60 mb. Een parameter geeft aan of deze methode een kort interval kan wachten voordat het wordt geretourneerd, zodat het systeem afval kan verzamelen en objecten kan voltooien. |
| GetTotalPauseDuration() |
Hiermee haalt u de totale hoeveelheid tijd op die is onderbroken in GC sinds het begin van het proces. |
| KeepAlive(Object) |
Verwijst naar het opgegeven object, waardoor het niet in aanmerking komt voor garbagecollection vanaf het begin van de huidige routine tot het punt waar deze methode wordt aangeroepen. |
| RefreshMemoryLimit() |
Hiermee geeft u de garbagecollector de opdracht om zichzelf opnieuw te configureren door de verschillende geheugenlimieten op het systeem te detecteren. |
| RegisterForFullGCNotification(Int32, Int32) |
Hiermee geeft u op dat er een melding voor de garbagecollection moet worden gegenereerd wanneer de voorwaarden de volledige garbagecollection bevorderen en wanneer de verzameling is voltooid. |
| RegisterNoGCRegionCallback(Int64, Action) |
Registreert een callback die moet worden aangeroepen wanneer een bepaalde hoeveelheid geheugen wordt toegewezen in de geen GC-regio. |
| RemoveMemoryPressure(Int64) |
Informeert de runtime dat onbeheerd geheugen is vrijgegeven en dat er geen rekening meer moet worden gehouden bij het plannen van garbagecollection. |
| ReRegisterForFinalize(Object) |
Vraagt dat het systeem de finalizer aanroept voor het opgegeven object waarvoor SuppressFinalize(Object) eerder is aangeroepen. |
| SuppressFinalize(Object) |
Vraagt dat de algemene taalruntime de finalizer voor het opgegeven object niet aanroept. |
| TryStartNoGCRegion(Int64, Boolean) |
Pogingen om garbagecollection niet toe te laten tijdens de uitvoering van een kritiek pad als er een opgegeven hoeveelheid geheugen beschikbaar is en bepaalt of de garbagecollector een volledige blokkerende garbagecollection uitvoert als er in eerste instantie onvoldoende geheugen beschikbaar is. |
| TryStartNoGCRegion(Int64, Int64, Boolean) |
Pogingen om garbagecollection tijdens de uitvoering van een kritiek pad te weigeren als er een opgegeven hoeveelheid geheugen beschikbaar is voor de grote object-heap en de kleine object-heap, en bepaalt of de garbagecollector een volledige blokkerende garbagecollection uitvoert als er in eerste instantie onvoldoende geheugen beschikbaar is. |
| TryStartNoGCRegion(Int64, Int64) |
Pogingen om garbagecollection tijdens de uitvoering van een kritiek pad te weigeren als er een opgegeven hoeveelheid geheugen beschikbaar is voor de grote object-heap en de kleine object heap. |
| TryStartNoGCRegion(Int64) |
Pogingen om garbagecollection niet toe te laten tijdens de uitvoering van een kritiek pad als er een opgegeven hoeveelheid geheugen beschikbaar is. |
| WaitForFullGCApproach() |
Retourneert de status van een geregistreerde melding om te bepalen of een volledige garbagecollection door de algemene taalruntime binnenkort wordt geblokkeerd. |
| WaitForFullGCApproach(Int32) |
Retourneert, in een opgegeven time-outperiode, de status van een geregistreerde melding om te bepalen of een volledige garbagecollection door de algemene taalruntime binnenkort wordt geblokkeerd. |
| WaitForFullGCApproach(TimeSpan) |
Retourneert, in een opgegeven time-outperiode, de status van een geregistreerde melding om te bepalen of een volledige garbagecollection door de algemene taalruntime binnenkort wordt geblokkeerd. |
| WaitForFullGCComplete() |
Retourneert de status van een geregistreerde melding om te bepalen of een volledige, blokkerende garbagecollection door de algemene taalruntime is voltooid. |
| WaitForFullGCComplete(Int32) |
Retourneert, in een opgegeven time-outperiode, de status van een geregistreerde melding om te bepalen of een volledige garbagecollection wordt geblokkeerd door algemene taal die de runtime heeft voltooid. |
| WaitForFullGCComplete(TimeSpan) |
Retourneert de status van een geregistreerde melding over of een blokkerende garbagecollection is voltooid. Kan voor onbepaalde tijd wachten op een volledige verzameling. |
| WaitForPendingFinalizers() |
De huidige thread wordt onderbroken totdat de thread die de wachtrij met finalizers verwerkt, die wachtrij heeft geleegd. |