Háttérbeli szemétgyűjtés

A háttérbeli szemétgyűjtésben (GC) a rendszer szükség szerint összegyűjti a rövid élettartamú generációkat (0 és 1), amíg a 2. generáció gyűjtése folyamatban van. A háttérbeli szemétgyűjtés egy vagy több dedikált szálon történik attól függően, hogy munkaállomásról vagy kiszolgálói GC-ről van-e szó, és csak a 2. generációs gyűjteményekre vonatkozik.

A háttérbeli szemétgyűjtés alapértelmezés szerint engedélyezve van. Engedélyezhető vagy letiltható a gcConcurrent konfigurációs beállítással .NET-keretrendszer alkalmazásokban, vagy a System.GC.Concurrent beállítással a .NET Core és a .NET 5 és újabb alkalmazásokban.

Feljegyzés

A háttérbeli szemétgyűjtés felváltja az egyidejű szemétgyűjtést, és .NET-keretrendszer 4- és újabb verziókban érhető el. A 4. .NET-keretrendszer csak a munkaállomás szemétgyűjtéséhez támogatott. A 4.5-ös .NET-keretrendszer kezdve a háttérbeli szemétgyűjtés a munkaállomás és a kiszolgáló szemétgyűjtéséhez is elérhető.

A háttérbeli szemétgyűjtés során a rövid élettartamú generációk gyűjteményét előtér szemétgyűjtésnek nevezzük. Előtérben lévő szemétgyűjtések esetén az összes felügyelt szál fel lesz függesztve.

Ha a háttérbeli szemétgyűjtés folyamatban van, és elegendő objektumot foglalt le a 0. generációban, a CLR a 0. vagy az 1. generációs előtérbeli szemétgyűjtést hajtja végre. A dedikált háttérbeli szemétgyűjtési szál gyakori biztonságos pontokon ellenőrzi, hogy van-e előtér-szemétgyűjtési kérés. Ha van ilyen, a háttérgyűjtemény felfüggeszti magát, hogy előtér-szemétgyűjtés következhessenek be. Az előtérben lévő szemétgyűjtés befejezése után a dedikált háttérbeli szemétgyűjtési szálak és a felhasználói szálak folytatódnak.

A háttérbeli szemétgyűjtés eltávolítja az egyidejű szemétgyűjtés által előírt foglalási korlátozásokat, mivel a háttérbeli szemétgyűjtés során rövid élettartamú szemétgyűjtések fordulhatnak elő. A háttérbeli szemétgyűjtés képes eltávolítani az elhalt objektumokat a tiszavirág generációkban. Szükség esetén az 1. generációs szemétgyűjtés során is bővíthető a halom.

Háttér-munkaállomás és kiszolgálói GC

A 4.5-ös .NET-keretrendszer kezdve a háttérbeli szemétgyűjtés elérhető a kiszolgálói GC-hez. A háttérbeli GC a kiszolgáló szemétgyűjtésének alapértelmezett módja.

A háttérkiszolgáló szemétgyűjtési funkciói a háttér-munkaállomás szemétgyűjtéséhez hasonlóan működnek, de van néhány különbség:

  • A háttér-munkaállomás szemétgyűjtése egy dedikált háttérbeli szemétgyűjtési szálat használ, míg a háttérkiszolgáló szemétgyűjtése több szálat használ. Általában minden logikai processzorhoz külön szál tartozik.

  • A munkaállomás háttérbeli szemétgyűjtési szálával ellentétben a háttérkiszolgáló GC-szálai nem időtúllépést hajtanak végre.

Az alábbi ábra egy külön, dedikált szálon végzett háttér-munkaállomás szemétgyűjtését mutatja be:

Background workstation garbage collection

Az alábbi ábrán a háttérkiszolgáló külön, dedikált szálakon végzett szemétgyűjtése látható:

Background server garbage collection

Egyidejű szemétgyűjtés

Tipp.

Ez a szakasz a következőkre vonatkozik:

  • .NET-keretrendszer 3.5-ös és korábbi verzió a munkaállomás szemétgyűjtéséhez
  • .NET-keretrendszer 4- és korábbi verzió a kiszolgáló szemétgyűjtéséhez

Az egyidejű szemetet a későbbi verziókban háttérbeli szemétgyűjtés váltja fel.

A munkaállomáson vagy a kiszolgálói szemétgyűjtésben engedélyezheti az egyidejű szemétgyűjtést, amely lehetővé teszi, hogy a szálak párhuzamosan fussanak egy dedikált szállal, amely a gyűjtemény teljes időtartama alatt elvégzi a szemétgyűjtést. Ez a beállítás csak a 2. generációs szemétgyűjtéseket érinti; 0 és 1 generáció mindig nem egyidejű, mert gyorsan befejeződnek.

Az egyidejű szemétgyűjtés lehetővé teszi, hogy az interaktív alkalmazások rugalmasabbak legyenek a gyűjtemények szüneteltetésének minimalizálásával. A felügyelt szálak az idő nagy részében továbbra is futtathatók, amíg az egyidejű szemétgyűjtési szál fut. Ez a kialakítás rövidebb szüneteket eredményez a szemétgyűjtés során.

Az egyidejű szemétgyűjtés dedikált szálon történik. Alapértelmezés szerint a CLR a munkaállomás szemétgyűjtését futtatja egyidejűleg engedélyezett szemétgyűjtéssel az egyprocesszoros és a többprocesszoros számítógépeken is.

Az alábbi ábrán egy külön dedikált szálon végzett egyidejű szemétgyűjtés látható.

Concurrent Garbage Collection Threads

Lásd még