Skräpinsamling i bakgrunden
I GC (Background Garbage Collection) samlas tillfälliga generationer (0 och 1) in efter behov medan samlingen av generation 2 pågår. Skräpinsamling i bakgrunden utförs på en eller flera dedikerade trådar, beroende på om det är en arbetsstation eller server-GC, och gäller endast för samlingar av generation 2.
Skräpinsamling i bakgrunden är aktiverat som standard. Den kan aktiveras eller inaktiveras med konfigurationsinställningen gcConcurrent i .NET Framework-appar eller inställningen System.GC.Concurrent i .NET Core- och .NET 5- och senare appar.
Kommentar
Skräpinsamling i bakgrunden ersätter samtidig skräpinsamling och är tillgänglig i .NET Framework 4 och senare versioner. I .NET Framework 4 stöds det endast för skräpinsamling för arbetsstationer . Från och med .NET Framework 4.5 är skräpinsamling i bakgrunden tillgänglig för både arbetsstation och serverskräpinsamling .
En samling på tillfälliga generationer under skräpinsamling i bakgrunden kallas förgrundsskräpinsamling . När förgrundsavfallssamlingar inträffar pausas alla hanterade trådar.
När skräpinsamling i bakgrunden pågår och du har allokerat tillräckligt många objekt i generation 0 utför CLR en förgrundsinsamling av förgrundsavfall av generation 0 eller generation 1. Den dedikerade skräpinsamlingstråden för bakgrund kontrollerar vid frekventa säkra platser för att avgöra om det finns en begäran om skräpinsamling i förgrunden. I så fall pausar bakgrundssamlingen sig själv så att förgrundsavfallsinsamling kan ske. När förgrundens skräpinsamling har slutförts återupptas de dedikerade skräpinsamlingstrådarna i bakgrunden och användartrådarna.
Skräpinsamling i bakgrunden tar bort allokeringsbegränsningar som införts av samtidig skräpinsamling, eftersom tillfälliga skräpsamlingar kan inträffa under skräpinsamling i bakgrunden. Skräpinsamling i bakgrunden kan ta bort döda objekt i tillfälliga generationer. Den kan också utöka heapen om det behövs under en skräpinsamling av generation 1.
Bakgrundsarbetsstation jämfört med server-GC
Från och med .NET Framework 4.5 är skräpinsamling i bakgrunden tillgänglig för server GC. Bakgrunds-GC är standardläget för server skräpinsamling.
Skräpinsamling för bakgrundsserver fungerar på samma sätt som skräpinsamling för bakgrundsarbetsstationer, men det finns några skillnader:
Skräpinsamling för bakgrundsarbetsstationer använder en särskild skräpinsamlingstråd i bakgrunden, medan skräpinsamlingen på bakgrundsservern använder flera trådar. Vanligtvis finns det en dedikerad tråd för varje logisk processor.
Till skillnad från skräpinsamlingstråden för arbetsstationens bakgrundsavfall överskrider inte GC-trådarna för bakgrundsservern tidsgränsen.
Följande bild visar skräpinsamling för bakgrundsarbetsstationer som utförs på en separat, dedikerad tråd:
Följande bild visar skräpinsamling för bakgrundsservern som utförs på separata dedikerade trådar:
Samtidig skräpinsamling
Dricks
Det här avsnittet gäller för:
- .NET Framework 3.5 och tidigare för skräpinsamling för arbetsstationer
- .NET Framework 4 och tidigare för skräpinsamling för server
Samtidiga skräp ersätts av skräpinsamling i bakgrunden i senare versioner.
I arbetsstation eller server skräpinsamling kan du aktivera samtidig skräpinsamling, vilket gör att trådar kan köras samtidigt med en dedikerad tråd som utför skräpinsamlingen under större delen av samlingen. Det här alternativet påverkar endast skräpsamlingar i generation 2. generation 0 och 1 är alltid icke-samtidiga eftersom de avslutas snabbt.
Samtidig skräpinsamling gör att interaktiva program blir mer dynamiska genom att minimera pauser för en samling. Hanterade trådar kan fortsätta att köras för det mesta medan den samtidiga skräpinsamlingstråden körs. Den här designen resulterar i kortare pauser medan en skräpinsamling sker.
Samtidig skräpinsamling utförs på en dedikerad tråd. Som standard kör CLR skräpinsamling för arbetsstationer med samtidig skräpinsamling aktiverad på både datorer med en processor och flera processorer.
Följande bild visar samtidig skräpinsamling som utförs på en separat dedikerad tråd.