GC Klass
Definition
Viktigt
En del information gäller för förhandsversionen av en produkt och kan komma att ändras avsevärt innan produkten blir allmänt tillgänglig. Microsoft lämnar inga garantier, uttryckliga eller underförstådda, avseende informationen som visas här.
Styr systemets skräpinsamlare, en tjänst som automatiskt återtar oanvänt minne.
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
- Arv
-
GC
Exempel
I följande exempel används flera GC-metoder för att hämta information om generering och minne om ett block med oanvända objekt och skriva ut det till konsolen. De oanvända objekten samlas sedan in och de resulterande minnessummorna visas.
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
Kommentarer
Klassen GC kontrollerar garbage collectorn. Skräpinsamlaren är en vanlig språkkörningskomponent som styr allokering och frisläppning av hanterat minne. Metoderna i den här klassen påverkar när skräpinsamling utförs på ett objekt och när resurser som allokeras av ett objekt släpps. Egenskaper i den här klassen ger information om den totala mängden minne som är tillgängligt i systemet och ålderskategorin, eller genereringen, av minne som allokerats till ett objekt.
Skräpinsamlaren spårar och återtar objekt som allokerats i hanterat minne. Med jämna mellanrum utför skräpinsamlaren skräpinsamling för att frigöra minne som allokerats till objekt där det inte finns några giltiga referenser. Skräpinsamling sker automatiskt när en minnesbegäran inte kan uppfyllas med tillgängligt ledigt minne. Ett program kan också framtvinga skräpinsamling med hjälp av Collect metoden .
Skräpinsamling består av följande steg:
- Skräpinsamlaren söker efter hanterade objekt som refereras till i hanterad kod.
- Skräpinsamlaren försöker slutföra objekt som inte refereras till.
- Skräpinsamlaren frigör objekt som inte refereras till och återtar deras minne.
Ohanterade resurser
Under en samling frigör inte skräpinsamlaren ett objekt om det hittar en eller flera referenser till objektet i hanterad kod. Skräpinsamlaren känner dock inte igen referenser till ett objekt från ohanterad kod och kan frigöra objekt som endast används i ohanterad kod om det inte uttryckligen hindras från att göra det. Metoden KeepAlive tillhandahåller en mekanism som förhindrar att skräpinsamlaren samlar in objekt som fortfarande används i ohanterad kod.
Förutom hanterade minnesallokeringar underhåller implementeringar av skräpinsamlaren inte information om resurser som innehas av ett objekt, till exempel filhandtag eller databasanslutningar. När en typ använder ohanterade resurser som måste frigöras innan instanser av typen återvinns, kan typen implementera en finalizer.
I de flesta fall implementeras finalizers genom att åsidosätta Object.Finalize-metoden; men typer som skrivs i C# eller C++ implementerar destruktorer, som kompilatorer omvandlar till en åsidosättning av Object.Finalize. Om ett objekt i de flesta fall har en slutförare anropar skräpinsamlaren det innan objektet frigörs. Skräpinsamlaren krävs dock inte för att anropa finalatorer i alla situationer. Metoden förhindrar till exempel SuppressFinalize uttryckligen att ett objekts finalizer anropas. Dessutom krävs inte skräpinsamlaren att använda en särskild tråd för att slutföra objekt, eller garantera den ordning i vilken finaliserare anropas för objekt som refererar till varandra men som annars kan samlas in av skräpinsamlaren.
I scenarier där resurser måste släppas vid en viss tidpunkt kan klasser implementera IDisposable gränssnittet, som innehåller den IDisposable.Dispose metod som utför resurshanterings- och rensningsuppgifter. Klasser som implementeras Dispose måste som en del av sitt klasskontrakt ange om och när klasskonsumenter anropar metoden för att rensa objektet. Skräpinsamlaren anropar inte metoden Dispose som standard; dock kan implementeringar av metoden Dispose anropa metoder i klassen GC för att anpassa finaliseringsbeteendet för skräpinsamlaren.
Mer information om objektslutsättning och mönstret för rensning finns i Rensa ohanterade resurser.
Objektåldring och generationer
Skräpinsamlaren i Common Language Runtime (CLR) har stöd för objektåldring med hjälp av generationer. En generation är en måttenhet för objektens relativa ålder i minnet. Ett objekts generationsnummer, eller ålder, anger den generering som ett objekt tillhör. Objekt som skapats på senare tid är en del av nyare generationer och har lägre generationsnummer än objekt som skapats tidigare i programmets livscykel. Objekt i den senaste generationen finns i generation 0. Den här implementeringen av skräpinsamlaren stöder tre generationer av objekt, generation 0, 1 och 2. Du kan hämta värdet för MaxGeneration egenskapen för att fastställa det maximala generationsnumret som stöds av systemet.
Objektåldring gör att program kan rikta skräpinsamling mot en viss uppsättning generationer i stället för att kräva att skräpinsamlaren utvärderar alla generationer. Med överlagringar av metoden Collect som innehåller en generation parameter kan du ange den äldsta generationen som ska samlas in med skräp.
Inaktivera skräphantering
Skräpinsamlaren stöder ett latensläge utan GC-region som kan användas under körning av kritiska sekvenser där skräpinsamling kan påverka ett programs prestanda negativt. Inget svarstidsläge för GC-regionen kräver att du anger en mängd minne som kan allokeras utan interferens från skräpinsamlaren. Om körningen kan allokera det minnet utför körningen inte någon skräpinsamling medan kod i den kritiska sökvägen körs.
Du definierar början av den kritiska sökvägen för regionen utan GC genom att anropa en av funktionens överlagringar för TryStartNoGCRegion. Du anger slutet på den kritiska sökvägen genom att anropa EndNoGCRegion metoden.
Du kan inte kapsla anrop till TryStartNoGCRegion metoden och du bör bara anropa EndNoGCRegion metoden om körningen för närvarande inte är i svarstidsläge för GC-regionen. Med andra ord bör du inte anropa TryStartNoGCRegion flera gånger (efter det första metodanropet kommer efterföljande anrop inte att lyckas) och du bör inte förvänta dig att EndNoGCRegion anropen ska lyckas bara för att TryStartNoGCRegion det första anropet lyckades.
Egenskaper
| Name | Description |
|---|---|
| MaxGeneration |
Hämtar det maximala antalet generationer som systemet stöder för närvarande. |
Metoder
| Name | Description |
|---|---|
| AddMemoryPressure(Int64) |
Informerar körningen av en stor allokering av ohanterat minne som bör beaktas vid schemaläggning av skräpinsamling. |
| AllocateArray<T>(Int32, Boolean) |
Allokerar en matris. |
| AllocateUninitializedArray<T>(Int32, Boolean) |
Allokerar en matris medan nollinitiering hoppas över, om möjligt. |
| CancelFullGCNotification() |
Avbryter registreringen av en skräpinsamlingsavisering. |
| Collect() |
Tvingar fram en omedelbar skräpinsamling av alla generationer. |
| Collect(Int32, GCCollectionMode, Boolean, Boolean) |
Tvingar fram en skräpinsamling från generation 0 via en angiven generation, vid en tidpunkt som anges av ett GCCollectionMode värde, med värden som anger om samlingen ska blockeras och komprimeras. |
| Collect(Int32, GCCollectionMode, Boolean) |
Tvingar fram en skräpinsamling från generation 0 via en angiven generation, vid en tidpunkt som anges av ett GCCollectionMode värde, med ett värde som anger om samlingen ska blockeras. |
| Collect(Int32, GCCollectionMode) |
Tvingar fram en skräpinsamling från generation 0 via en angiven generation, vid en tidpunkt som anges av ett GCCollectionMode värde. |
| Collect(Int32) |
Tvingar fram en omedelbar skräpinsamling från generation 0 via en angiven generation. |
| CollectionCount(Int32) |
Returnerar antalet gånger skräpinsamlingen har inträffat för den angivna genereringen av objekt. |
| EndNoGCRegion() |
Avslutar svarstidsläget för ingen GC-region. |
| GetAllocatedBytesForCurrentThread() |
Hämtar det totala antalet byte som allokerats till den aktuella tråden sedan början av dess livslängd. |
| GetConfigurationVariables() |
Hämtar de konfigurationer som används av skräpinsamlaren. |
| GetGCMemoryInfo() |
Hämtar minnesinformation för skräpinsamling. |
| GetGCMemoryInfo(GCKind) |
Hämtar minnesinformation för skräpinsamling. |
| GetGeneration(Object) |
Returnerar det aktuella generationsnumret för det angivna objektet. |
| GetGeneration(WeakReference) |
Returnerar det aktuella generationsnumret för målet för en angiven svag referens. |
| GetTotalAllocatedBytes(Boolean) |
Hämtar ett antal byte som allokerats under processens livslängd. Det returnerade värdet innehåller inga inbyggda allokeringar. |
| GetTotalMemory(Boolean) |
Hämtar heapstorleken exklusive fragmentering. Om den totala GC-heapstorleken till exempel är 100 mb och fragmentering, dvs. utrymme som tas upp av kostnadsfria objekt, tar upp 40 mb, skulle det här API:et rapportera 60 mb. En parameter anger om den här metoden kan vänta ett kort intervall innan den returneras, så att systemet kan samla in skräp och slutföra objekt. |
| GetTotalPauseDuration() |
Hämtar den totala tiden som pausats i GC sedan processens början. |
| KeepAlive(Object) |
Refererar till det angivna objektet, vilket gör det inte berättigat för skräpinsamling från början av den aktuella rutinen till den punkt där den här metoden anropas. |
| RefreshMemoryLimit() |
Instruerar skräpinsamlaren att konfigurera om sig själv genom att identifiera systemets olika minnesgränser. |
| RegisterForFullGCNotification(Int32, Int32) |
Anger att ett skräpinsamlingsmeddelande ska genereras när villkor gynnar fullständig skräpinsamling och när samlingen har slutförts. |
| RegisterNoGCRegionCallback(Int64, Action) |
Registrerar ett återanrop som ska anropas när en viss mängd minne allokeras i ingen GC-region. |
| RemoveMemoryPressure(Int64) |
Informerar körningen om att ohanterat minne har släppts och inte längre behöver beaktas vid schemaläggning av skräpinsamling. |
| ReRegisterForFinalize(Object) |
Begär att systemet anropar finaliseraren för det angivna objektet som SuppressFinalize(Object) tidigare har anropats. |
| SuppressFinalize(Object) |
Begär att den vanliga språkkörningen inte anropar finaliseraren för det angivna objektet. |
| TryStartNoGCRegion(Int64, Boolean) |
Försöker att inte tillåta skräpinsamling under körningen av en kritisk sökväg om en angiven mängd minne är tillgängligt och styr om skräpinsamlaren gör en fullständig blockering av skräpinsamling om det inte finns tillräckligt med minne från början. |
| TryStartNoGCRegion(Int64, Int64, Boolean) |
Försöker att inte tillåta skräpinsamling under körningen av en kritisk sökväg om en angiven mängd minne är tillgängligt för den stora objekthögen och den lilla objekthögen, och styr om skräpinsamlaren utför en fullständig blockering av skräpinsamling om det inte finns tillräckligt med minne från början. |
| TryStartNoGCRegion(Int64, Int64) |
Försöker att inte tillåta skräpinsamling under körningen av en kritisk sökväg om en angiven mängd minne är tillgängligt för den stora objekthögen och den lilla objekthögen. |
| TryStartNoGCRegion(Int64) |
Försöker att inte tillåta skräpinsamling under körningen av en kritisk sökväg om en angiven mängd minne är tillgängligt. |
| WaitForFullGCApproach() |
Returnerar statusen för ett registrerat meddelande för att avgöra om en fullständig, blockerande skräpinsamling av den gemensamma språkkörningen är nära förestående. |
| WaitForFullGCApproach(Int32) |
Returnerar statusen för ett registrerat meddelande under en angiven tidsgräns för att avgöra om en fullständig, blockerande skräpinsamling av den gemensamma språkkörningen är nära förestående. |
| WaitForFullGCApproach(TimeSpan) |
Returnerar statusen för ett registrerat meddelande under en angiven tidsgräns för att avgöra om en fullständig, blockerande skräpinsamling av den gemensamma språkkörningen är nära förestående. |
| WaitForFullGCComplete() |
Returnerar statusen för ett registrerat meddelande för att avgöra om en fullständig, blockerande skräpinsamling av den gemensamma språkkörningen har slutförts. |
| WaitForFullGCComplete(Int32) |
Returnerar statusen för ett registrerat meddelande under en angiven tidsgräns för att avgöra om en fullständig, blockerande skräpinsamling efter vanligt språk som körningen har slutfört. |
| WaitForFullGCComplete(TimeSpan) |
Returnerar statusen för ett registrerat meddelande om huruvida en blockerande skräpinsamling har slutförts. Kan vänta på obestämd tid för en fullständig samling. |
| WaitForPendingFinalizers() |
Pausar den aktuella tråden tills tråden som bearbetar kön med slutförare har tömt kön. |