Grundlagen der Garbage CollectionFundamentals of garbage collection

In der Common Language Runtime (CLR) dient der Garbage Collector (GC) als automatischer Speicher-Manager.In the common language runtime (CLR), the garbage collector (GC) serves as an automatic memory manager. Der Garbage Collector bietet folgende Vorteile:It provides the following benefits:

  • Ermöglicht es Ihnen, eine Anwendung zu entwickeln, ohne den Speicher manuell freigeben zu müssen.Enables you to develop your application without having to manually free memory.

  • Ordnet dem verwalteten Heap effizient Objekte zu.Allocates objects on the managed heap efficiently.

  • Gibt Objekte frei, die nicht mehr verwendet werden, löscht den Speicher und hält Speicher für zukünftige Belegungen bereit.Reclaims objects that are no longer being used, clears their memory, and keeps the memory available for future allocations. Verwaltete Objekte beginnen automatisch mit einem bereinigten Inhalt, damit ihre Konstruktoren nicht jedes Datenfeld initialisieren müssen.Managed objects automatically get clean content to start with, so their constructors do not have to initialize every data field.

  • Bietet Speichersicherheit, indem sichergestellt wird, dass ein Objekt den Inhalt eines anderen Objekts nicht verwenden kann.Provides memory safety by making sure that an object cannot use the content of another object.

In diesem Artikel werden die wichtigsten Konzepte der Garbage Collection beschrieben.This article describes the core concepts of garbage collection.

Grundlagen des ArbeitsspeichersFundamentals of memory

Die folgende Liste liefert eine Zusammenfassung wichtiger Arbeitsspeicherkonzepte der CLR.The following list summarizes important CLR memory concepts.

  • Jeder Prozess verfügt über einen eigenen separaten virtuellen Adressraum.Each process has its own, separate virtual address space. Alle Prozesse auf demselben Computer verwenden den gleichen physischen Speicher und die gleiche Auslagerungsdatei, sofern vorhanden.All processes on the same computer share the same physical memory and the page file, if there is one.

  • In der Standardeinstellung verfügt jeder Prozess auf 32-Bit-Computern über einen virtuellen Adressraum von 2 GB im Benutzermodus.By default, on 32-bit computers, each process has a 2-GB user-mode virtual address space.

  • Als Anwendungsentwickler arbeiten Sie immer mit einem virtuellem Adressraum und manipulieren niemals direkt den physischen Speicher.As an application developer, you work only with virtual address space and never manipulate physical memory directly. Der Garbage Collector belegt und gibt virtuellen Arbeitsspeicher auf dem verwalteten Heap frei.The garbage collector allocates and frees virtual memory for you on the managed heap.

    Wenn Sie nativen Code schreiben, verwenden Sie die Windows-Funktionen für das Arbeiten mit dem virtuellen Adressraum.If you are writing native code, you use Windows functions to work with the virtual address space. Diese Funktionen belegen und geben für Sie virtuellen Arbeitsspeicher auf systemeigenen Heaps frei.These functions allocate and free virtual memory for you on native heaps.

  • Virtueller Arbeitsspeicher kann sich in einem von drei Zuständen befinden:Virtual memory can be in three states:

    • Frei.Free. Es sind keine Verweise auf den Speicherblock vorhanden, und der Speicherblock ist für eine Speicherbelegung verfügbar.The block of memory has no references to it and is available for allocation.

    • Reserviert.Reserved. Der Speicherblock ist für die Verwendung verfügbar und kann nicht durch andere Anforderungen belegt werden.The block of memory is available for your use and cannot be used for any other allocation request. Sie können jedoch keine Daten in diesem Speicherblock speichern, bis eine Zusicherung erfolgt ist.However, you cannot store data to this memory block until it is committed.

    • Zugesichert.Committed. Der Speicherblock ist einem physischen Speicher zugewiesen.The block of memory is assigned to physical storage.

  • Im virtuellen Adressraum können Fragmentierungen auftreten.Virtual address space can get fragmented. Das bedeutet, dass freie Blöcke (Lücken) im Adressraum vorhanden sind.This means that there are free blocks, also known as holes, in the address space. Wenn eine virtuelle Speicherbelegung angefordert wird, muss der Manager für virtuellen Arbeitsspeicher einen einzelnen freien Block finden, der groß genug ist, um die Belegungsanforderung zu erfüllen.When a virtual memory allocation is requested, the virtual memory manager has to find a single free block that is large enough to satisfy that allocation request. Selbst wenn 2 GB freier Speicherplatz verfügbar sind, wird die Speicherbelegung, die 2 GB angefordert hat, fehlschlagen, wenn der freie Speicherplatz nicht in einem einzelnen Adressblock verfügbar ist.Even if you have 2 GB of free space, the allocation that requires 2 GB will be unsuccessful unless all of that free space is in a single address block.

  • Es kann vorkommen, dass nicht mehr genügend Arbeitsspeicher zur Verfügung steht, weil der für Belegungen verfügbare virtuelle Adressraum oder der für Zusicherungen verfügbare physische Speicher nicht mehr ausreicht.You can run out of memory if there isn't enough virtual address space to reserve or physical space to commit.

    Die Auslagerungsdatei wird auch dann verwendet, wenn der tatsächliche physische Speicherbedarf insgesamt eher niedrig ist.The page file is used even if physical memory pressure (that is, demand for physical memory) is low. Wenn das erste Mal eine hohe physische Speicherauslastung auftritt, muss das Betriebssystem im physischen Speicher freien Platz für die Datenspeicherung schaffen. Zu diesem Zweck werden einige Daten aus dem physischen Speicher in die Auslagerungsdatei verschoben.The first time physical memory pressure is high, the operating system must make room in physical memory to store data, and it backs up some of the data that is in physical memory to the page file. Für diese Daten erfolgt solange keine neue Speicherzuordnung, bis sie tatsächlich benötigt werden. Daher können Situationen entstehen, in denen auch bei einer geringen physischen Speicherauslastung Daten in der Auslagerungsdatei abgelegt sind.That data is not paged until it's needed, so it's possible to encounter paging in situations where the physical memory pressure is low.

Bedingungen für eine Garbage CollectionConditions for a garbage collection

Eine Garbage Collection wird durchgeführt, wenn eine der folgenden Bedingungen zutrifft:Garbage collection occurs when one of the following conditions is true:

  • Das System verfügt über einen kleinen physikalischen Speicher.The system has low physical memory. Dies wird entweder durch die Meldung des Betriebssystems über zu wenig Arbeitsspeicher oder durch die Meldung des Hosts über zu wenig Arbeitsspeicher erkannt.This is detected by either the low memory notification from the OS or low memory as indicated by the host.

  • Der Speicher, der von Objekten belegt wird, die dem verwalteten Heap zugeordnet sind, übersteigt einen akzeptablen Schwellenwert.The memory that is used by allocated objects on the managed heap surpasses an acceptable threshold. Dieser Schwellenwert wird während der Prozessausführung kontinuierlich angepasst.This threshold is continuously adjusted as the process runs.

  • Die GC.Collect -Methode wird aufgerufen.The GC.Collect method is called. In fast allen Fällen müssen Sie diese Methode nicht aufrufen, da der Garbage Collector kontinuierlich ausgeführt wird.In almost all cases, you do not have to call this method, because the garbage collector runs continuously. Diese Methode wird hauptsächlich für eindeutige Situationen und für Tests verwendet.This method is primarily used for unique situations and testing.

Der verwaltete HeapThe managed heap

Nachdem der Garbage Collector von der CLR initialisiert wurde, belegt er ein Arbeitsspeichersegment für die Speicherung und Verwaltung von Objekten.After the garbage collector is initialized by the CLR, it allocates a segment of memory to store and manage objects. Dieser Speicher wird als verwalteter Heap bezeichnet, im Gegensatz zu einem systemeigenen Heap im Betriebssystem.This memory is called the managed heap, as opposed to a native heap in the operating system.

Es gibt einen verwalteten Heap für jeden verwalteten Prozess.There is a managed heap for each managed process. Alle Threads im Prozess ordnen Speicher zu, für Objekte auf dem gleichen Heap.All threads in the process allocate memory for objects on the same heap.

Zum Reservieren von Speicher ruft der Garbage Collector die VirtualAlloc-Windows-Funktion auf und reserviert jeweils ein Segment des Speichers für verwaltete Anwendungen.To reserve memory, the garbage collector calls the Windows VirtualAlloc function and reserves one segment of memory at a time for managed applications. Zudem reserviert der Garbage Collector nach Bedarf weitere Segmente und gibt Segmente wieder für das Betriebssystem frei (nachdem alle Objekte aus diesen entfernt wurden), indem er die VirtualFree-Windows-Funktion aufruft.The garbage collector also reserves segments, as needed, and releases segments back to the operating system (after clearing them of any objects) by calling the Windows VirtualFree function.

Wichtig

Die Größe der Segmente, die vom Garbage Collector zugeordnet werden, ist implementierungsspezifisch und kann jederzeit, auch in regelmäßigen Updates, geändert werden.The size of segments allocated by the garbage collector is implementation-specific and is subject to change at any time, including in periodic updates. Für eine Anwendung darf weder eine bestimmte Segmentgröße vorausgesetzt werden, noch darf sie von einer bestimmten Segmentgröße abhängen noch darf in ihr versucht werden, die Menge des für Segmentbelegungen verfügbaren Speichers zu konfigurieren.Your app should never make assumptions about or depend on a particular segment size, nor should it attempt to configure the amount of memory available for segment allocations.

Je weniger Objekte dem Heap zugeordnet sind, desto geringer ist der Arbeitsaufwand für den Garbage Collector.The fewer objects allocated on the heap, the less work the garbage collector has to do. Wenn Sie Objekte zuordnen, verwenden Sie keine aufgerundeten Werte, die größer sind als die tatsächlichen Anforderungen. Belegen Sie z. B. kein Array von 32 Byte, wenn Sie nur 15 Byte benötigen.When you allocate objects, do not use rounded-up values that exceed your needs, such as allocating an array of 32 bytes when you need only 15 bytes.

Wenn eine Garbage Collection ausgelöst wird, gibt der Garbage Collector den Speicher frei, der von inaktiven Objekten belegt wird.When a garbage collection is triggered, the garbage collector reclaims the memory that is occupied by dead objects. Bei der Freigabe von Speicher werden aktive Objekte komprimiert, damit sie zusammen verschoben werden, und der inaktive Speicherplatz wird entfernt, sodass der Heap kleiner wird.The reclaiming process compacts live objects so that they are moved together, and the dead space is removed, thereby making the heap smaller. Dadurch wird sichergestellt, dass Objekte, die gemeinsam zugeordnet wurden, auf dem verwalteten Heap zusammenbleiben, um ihre Lokalität beizubehalten.This ensures that objects that are allocated together stay together on the managed heap, to preserve their locality.

Die Intrusivität (Häufigkeit und Dauer) von Garbage Collections wird bestimmt durch den Umfang der Speicherbelegungen und der Größe des beibehaltenen Speichers auf dem verwalteten Heap.The intrusiveness (frequency and duration) of garbage collections is the result of the volume of allocations and the amount of survived memory on the managed heap.

Der Heap kann als Ansammlung von zwei Heaps betrachtet werden: der große Objektheap und der kleine Objektheap.The heap can be considered as the accumulation of two heaps: the large object heap and the small object heap.

Der große Objektheap enthält sehr große Objekte, die mindestens 85.000 Bytes groß sind.The large object heap contains very large objects that are 85,000 bytes and larger. Die Objekte auf dem großen Objektheap sind normalerweise Arrays.The objects on the large object heap are usually arrays. Ein Instanzobjekt ist meistens nicht sehr groß.It is rare for an instance object to be extremely large.

Tipp

Sie können den Schwellenwert für die Objekte im großen Objektheap festlegen.You can configure the threshold size for objects to go on the large object heap.

GenerationenGenerations

Der Heap ist in Generationen organisiert, damit er langlebige und kurzlebige Objekte behandeln kann.The heap is organized into generations so it can handle long-lived and short-lived objects. Die Garbage Collection tritt hauptsächlich in Verbindung mit der Freigabe kurzlebiger Objekte auf, die in der Regel nur einen kleinen Teil des Heaps belegen.Garbage collection primarily occurs with the reclamation of short-lived objects that typically occupy only a small part of the heap. Auf dem Heap gibt es drei Generationen von Objekten:There are three generations of objects on the heap:

  • Generation 0.Generation 0. Dies ist die jüngste Generation, die kurzlebige Objekte enthält.This is the youngest generation and contains short-lived objects. Ein Beispiel für ein kurzlebiges Objekt ist eine temporäre Variable.An example of a short-lived object is a temporary variable. Die Garbage Collection tritt am häufigsten in dieser Generation auf.Garbage collection occurs most frequently in this generation.

    Neu zugeordnete Objekte bilden eine neue Generation von Objekten und sind implizit Sammlungen der Generation 0.Newly allocated objects form a new generation of objects and are implicitly generation 0 collections. Wenn es sich jedoch um große Objekte handelt, werden sie im großen Objektheap in einer Sammlung der Generation 2 verwaltet.However, if they are large objects, they go on the large object heap in a generation 2 collection.

    Die meisten Objekte werden bei einer Garbage Collection in Generation 0 freigegeben und bleiben nicht bis zur nächsten Generation aktiv.Most objects are reclaimed for garbage collection in generation 0 and do not survive to the next generation.

  • Generation 1.Generation 1. Diese Generation enthält kurzlebige Objekte und dient als Puffer zwischen kurzlebigen Objekten und langlebigen Objekten.This generation contains short-lived objects and serves as a buffer between short-lived objects and long-lived objects.

  • Generation 2.Generation 2. Diese Generation enthält langlebige Objekte.This generation contains long-lived objects. Ein Beispiel für ein langlebiges Objekt ist ein Objekt in einer Serveranwendung, das statische Daten enthält, die für die Dauer des Prozesses aktiv sind.An example of a long-lived object is an object in a server application that contains static data that's live for the duration of the process.

Garbage Collections finden für bestimmte Generationen statt, wenn die Bedingungen dies erfordern.Garbage collections occur on specific generations as conditions warrant. Das Durchführen einer Sammlung für eine Generation bedeutet, dass Objekte in dieser Generation und in allen jüngeren Generationen gesammelt werden.Collecting a generation means collecting objects in that generation and all its younger generations. Eine Garbage Collection für Generation 2 wird auch als vollständige Garbage Collection bezeichnet, da hierbei alle Objekte in allen Generationen (das heißt, alle Objekte im verwalteten Heap) freigegeben werden.A generation 2 garbage collection is also known as a full garbage collection, because it reclaims all objects in all generations (that is, all objects in the managed heap).

Beibehaltene Objekte und HöherstufungenSurvival and promotions

Objekte, die bei einer Garbage Collection nicht freigegeben werden, werden als beibehaltene Objekte bezeichnet und auf die nächste Generation höher gestuft.Objects that are not reclaimed in a garbage collection are known as survivors and are promoted to the next generation. Objekte, die nach einer Garbage Collection in Generation 0 noch vorhanden sind, werden auf Generation 1 höher gestuft; Objekte, die nach einer Garbage Collection in Generation 1 noch vorhanden sind, werden auf Generation 2 höher gestuft. Objekte, die nach einer Garbage Collection Generation 2 noch vorhanden sind, bleiben in Generation 2.Objects that survive a generation 0 garbage collection are promoted to generation 1; objects that survive a generation 1 garbage collection are promoted to generation 2; and objects that survive a generation 2 garbage collection remain in generation 2.

Wenn der Garbage Collector erkennt, dass die Rate der beibehaltenen Objekte in einer Generation hoch ist, erhöht er den Schwellenwert der Zuteilungen für diese Generation.When the garbage collector detects that the survival rate is high in a generation, it increases the threshold of allocations for that generation. Somit wird bei der nächsten Garbage Collection eine beträchtliche Menge an Speicherplatz freigegeben.The next collection gets a substantial size of reclaimed memory. Die CLR wägt ständig zwei Prioritäten gegeneinander ab: Zum einen soll das Workingset einer Anwendung durch die Verzögerung der Garbage Collection nicht zu groß werden, und zum anderen soll die Garbage Collection nicht zu häufig ausgeführt werden.The CLR continually balances two priorities: not letting an application's working set get too large by delaying garbage collection and not letting the garbage collection run too frequently.

Kurzlebige Generationen und SegmenteEphemeral generations and segments

Da Objekte in der Generation 0 und 1 kurzlebig sind, werden diese Generationen als kurzlebige Generationen bezeichnet.Because objects in generations 0 and 1 are short-lived, these generations are known as the ephemeral generations.

Kurzlebige Generationen müssen das Speichersegment belegen, das als kurzlebiges Segment bezeichnet wird.Ephemeral generations must be allocated in the memory segment that is known as the ephemeral segment. Jedes neue vom Garbage Collector abgerufene Segment wird das neue kurzlebige Segment und enthält die Objekte, die nach einer Garbage Collection in Generation 0 noch bestehen.Each new segment acquired by the garbage collector becomes the new ephemeral segment and contains the objects that survived a generation 0 garbage collection. Das alte kurzlebige Segment wird das neue Segment der Generation 2.The old ephemeral segment becomes the new generation 2 segment.

Die Größe des kurzlebigen Segments variiert abhängig davon, ob ein System ein 32-Bit- oder ein 64-Bit-System ist, und welchen Typ der Garbage Collector hat, der ausgeführt wird.The size of the ephemeral segment varies depending on whether a system is 32-bit or 64-bit, and on the type of garbage collector it is running. Die Standardwerte sind in der folgenden Tabelle aufgeführt.Default values are shown in the following table.

32-Bit32-bit 64-Bit64-bit
Arbeitsstation-GCWorkstation GC 16 MB16 MB 256 MB256 MB
Server-GCServer GC 64 MB64 MB 4 GB4 GB
Server-GC mit > 4 logischen CPUsServer GC with > 4 logical CPUs 32 MB32 MB 2 GB2 GB
Server-GC mit > 8 logischen CPUsServer GC with > 8 logical CPUs 16 MB16 MB 1 GB1 GB

Das kurzlebige Segment kann Objekte der Generation 2 einschließen.The ephemeral segment can include generation 2 objects. Objekte der Generation 2 können mehrere Segmente verwenden (so viele, wie der Prozess erfordert und für den Speicher vorgesehen sind).Generation 2 objects can use multiple segments (as many as your process requires and memory allows for).

Die Menge an Speicher, der bei einer kurzlebigen Garbage Collection freigegeben wird, ist auf die Größe des kurzlebigen Segments beschränkt.The amount of freed memory from an ephemeral garbage collection is limited to the size of the ephemeral segment. Der Umfang des freigegebenen Speichers ist proportional zum Speicherplatz, der von den inaktiven Objekten belegt wurde.The amount of memory that is freed is proportional to the space that was occupied by the dead objects.

Was geschieht während einer Garbage CollectionWhat happens during a garbage collection

Eine Garbage Collection umfasst die folgenden Phasen:A garbage collection has the following phases:

  • Eine Markierungsphase, die eine Liste aller aktiven Objekte ermittelt und erstellt.A marking phase that finds and creates a list of all live objects.

  • Eine Neuzuordnungsphase, in der die Verweise auf die zu komprimierenden Objekte aktualisiert werden.A relocating phase that updates the references to the objects that will be compacted.

  • Eine Komprimierungsphase, in der der von den inaktiven Objekten belegte Speicherplatz freigegeben und die noch bestehenden Objekte komprimiert werden.A compacting phase that reclaims the space occupied by the dead objects and compacts the surviving objects. In der Komprimierungsphase werden die Objekte, die nach einer Garbage Collection noch vorhanden sind, zum älteren Ende des Segments verschoben.The compacting phase moves objects that have survived a garbage collection toward the older end of the segment.

    Da Auflistungen der Generation 2 mehrere Segmente belegen können, können Objekte, die auf Generation 2 höher gestuft werden, in ein älteres Segment verschoben werden.Because generation 2 collections can occupy multiple segments, objects that are promoted into generation 2 can be moved into an older segment. Objekte, die sowohl Generation 1 als auch Generation 2 überlebt haben, können in ein anderes Segment verschoben werden, da sie auf Generation 2 höher gestuft werden.Both generation 1 and generation 2 survivors can be moved to a different segment, because they are promoted to generation 2.

    Normalerweise wird der große Objektheap (LOH) nicht komprimiert, da das Kopieren großer Objekte Leistungseinbußen zur Folge hat.Ordinarily, the large object heap (LOH) is not compacted, because copying large objects imposes a performance penalty. In .NET Core und ab .NET Framework 4.5.1 können Sie jedoch die Eigenschaft GCSettings.LargeObjectHeapCompactionMode verwenden, um bei Bedarf den großen Objektheap zu komprimieren.However, in .NET Core and in .NET Framework 4.5.1 and later, you can use the GCSettings.LargeObjectHeapCompactionMode property to compact the large object heap on demand. Außerdem wird der LOH automatisch komprimiert, wenn eine feste Grenze festgelegt wird, indem Folgendes angegeben wird:In addition, the LOH is automatically compacted when a hard limit is set by specifying either:

Der Garbage Collector bestimmt anhand folgender Informationen, ob Objekte aktiv sind:The garbage collector uses the following information to determine whether objects are live:

  • Stapelstämme.Stack roots. Vom Just-In-Time (JIT)-Compiler bereitgestellte Stapelvariablen und Stackwalker.Stack variables provided by the just-in-time (JIT) compiler and stack walker. Durch JIT-Optimierungen können Bereiche des Codes, in denen Stapelvariablen dem Garbage Collector gemeldet werden, verlängert oder verkürzt werden.JIT optimizations can lengthen or shorten regions of code within which stack variables are reported to the garbage collector.

  • Garbage Collection-Handles.Garbage collection handles. Diese Handles zeigen auf verwaltete Objekte und können vom Benutzercode oder der Common Language Runtime zugeordnet werden.Handles that point to managed objects and that can be allocated by user code or by the common language runtime.

  • Statische Daten.Static data. Statische Objekte in Anwendungsdomänen, die auf andere Objekte verweisen können.Static objects in application domains that could be referencing other objects. Jede Anwendungsdomäne verfolgt die eigenen statischen Objekte.Each application domain keeps track of its static objects.

Vor dem Start einer Garbage Collection werden alle verwalteten Threads bis auf den Thread, der die Garbage Collection ausgelöst hat, angehalten.Before a garbage collection starts, all managed threads are suspended except for the thread that triggered the garbage collection.

Die folgende Abbildung zeigt einen Thread, der eine Garbage Collection auslöst und eine Unterbrechung der Ausführung anderer Threads verursacht.The following illustration shows a thread that triggers a garbage collection and causes the other threads to be suspended.

Garbage Collection, die durch einen Thread ausgelöst wird

Bearbeiten von nicht verwalteten RessourcenManipulate unmanaged resources

Wenn die verwalteten Objekte mit ihren nativen Dateihandles auf nicht verwaltete Objekte verweisen, müssen Sie die nicht verwalteten Objekte explizit freigeben, da der Garbage Collector den Speicher nur für den verwalteten Heap verfolgt.If managed objects reference unmanaged objects by using their native file handles, you have to explicitly free the unmanaged objects, because the garbage collector only tracks memory on the managed heap.

Benutzer des verwalteten Objekts geben möglicherweise nicht die nativen Ressourcen frei, die vom Objekt verwendet werden.Users of the managed object may not dispose the native resources used by the object. Um die Bereinigung auszuführen, können Sie das verwaltete Objekt abschließen.To perform the cleanup, you can make the managed object finalizable. Der Abschluss umfasst Bereinigungsaktionen, die Sie ausführen, wenn das Objekt nicht mehr verwendet wird.Finalization consists of cleanup actions that execute when the object is no longer in use. Wenn das verwaltete Objekt nicht mehr aktiv ist, führt es Bereinigungsaktionen aus, die in der Finalizer-Methode angegeben sind.When the managed object dies, it performs cleanup actions that are specified in its finalizer method.

Wenn festgestellt wird, dass ein abzuschließendes Objekt inaktiv ist, wird der Finalizer des Objekts in eine Warteschlange eingereiht, damit die dazugehörigen Bereinigungsaktionen ausgeführt werden. Das Objekt selbst wird jedoch auf die nächste Generation höher gestuft.When a finalizable object is discovered to be dead, its finalizer is put in a queue so that its cleanup actions are executed, but the object itself is promoted to the next generation. Daher müssen Sie bis zur nächsten Garbage Collection warten, die für diese Generation stattfindet (dies ist nicht notwendigerweise die nächste Garbage Collection), um zu bestimmen, ob das Objekt freigegeben wurde.Therefore, you have to wait until the next garbage collection that occurs on that generation (which is not necessarily the next garbage collection) to determine whether the object has been reclaimed.

Weitere Informationen zur Finalisierung finden Sie unter Object.Finalize().For more information about finalization, see Object.Finalize().

Garbage Collection für die Arbeitsstation und Garbage Collection auf dem ServerWorkstation and server garbage collection

Der Garbage Collector optimiert sich selbst und kann in einer Vielzahl von Szenarien funktionieren.The garbage collector is self-tuning and can work in a wide variety of scenarios. Sie können die Einstellung einer Konfigurationsdatei verwenden, um den Typ der Garbage Collection basierend auf den Merkmalen der Arbeitsauslastung festzulegen.You can use a configuration file setting to set the type of garbage collection based on the characteristics of the workload. Die CLR stellt mehrere Arten der Garbage Collection bereit:The CLR provides the following types of garbage collection:

  • Die Garbage Collection (GC) für die Arbeitsstation ist für Client-Apps konzipiert.Workstation garbage collection (GC) is designed for client apps. Dies ist die GC-Standardkonfiguration für eigenständige Apps.It is the default GC flavor for standalone apps. Für gehostete Apps, z. B. die von ASP.NET gehosteten Apps, bestimmt der Host die GC-Standardkonfiguration.For hosted apps, for example, those hosted by ASP.NET, the host determines the default GC flavor.

    Die Garbage Collection für die Arbeitsstation kann gleichzeitig oder nicht gleichzeitig erfolgen.Workstation garbage collection can be concurrent or non-concurrent. Die gleichzeitige Garbage Collection ermöglicht, dass verwaltete Threads während einer Garbage Collection Vorgänge fortgesetzt werden können.Concurrent garbage collection enables managed threads to continue operations during a garbage collection. Ab .NET Framework 4 wird die gleichzeitige Garbage Collection durch die Garbage Collection im Hintergrund ersetzt.Background garbage collection replaces concurrent garbage collection in .NET Framework 4 and later versions.

  • Garbage Collection für Server, die für Serveranwendungen vorgesehen ist, die einen hohen Durchsatz und eine hohe Skalierbarkeit erfordern.Server garbage collection, which is intended for server applications that need high throughput and scalability.

    • In .NET Core kann die Garbage Collection auf dem Server nicht-gleichzeitig oder im Hintergrund ausgeführt werden.In .NET Core, server garbage collection can be non-concurrent or background.

    • Ab .NET Framework 4.5 kann die Garbage Collection auf dem Server nicht-gleichzeitig oder im Hintergrund ausgeführt werden (die Garbage Collection im Hintergrund ersetzt die gleichzeitige Garbage Collection).In .NET Framework 4.5 and later versions, server garbage collection can be non-concurrent or background (background garbage collection replaces concurrent garbage collection). In .NET Framework 4 und früheren Versionen erfolgt die Garbage Collection auf dem Server gleichzeitig.In .NET Framework 4 and previous versions, server garbage collection is non-concurrent.

Die folgende Abbildung zeigt die dedizierten Threads, die die Garbage Collection auf einem Server ausführen:The following illustration shows the dedicated threads that perform the garbage collection on a server:

Threads für Garbage Collection auf dem Server

Vergleich der Garbage Collection für die Arbeitsstation und der Garbage Collection auf dem ServerCompare workstation and server garbage collection

Im Folgenden finden Sie Überlegungen zu Threading und Leistung der Garbage Collection auf Arbeitsstationen:The following are threading and performance considerations for workstation garbage collection:

  • Die Garbage Collection erfolgt auf dem Benutzerthread, der die Garbage Collection ausgelöst hat, und die Priorität bleibt unverändert.The collection occurs on the user thread that triggered the garbage collection and remains at the same priority. Da Benutzerthreads in der Regel mit normaler Priorität ausgeführt werden, muss der Garbage Collector (der auf einem Thread mit normaler Priorität ausgeführt wird) mit anderen Threads um CPU-Zeit konkurrieren.Because user threads typically run at normal priority, the garbage collector (which runs on a normal priority thread) must compete with other threads for CPU time. (Threads, die nativen Code ausführen, werden bei der Garbage Collection für die Arbeitsstation bzw. auf dem Server nicht angehalten.)(Threads that run native code are not suspended on either server or workstation garbage collection.)

  • Die Garbage Collection für die Arbeitsstation wird immer auf einem Computer verwendet, der nur einen Prozessor besitzt, unabhängig von der Konfigurationseinstellung.Workstation garbage collection is always used on a computer that has only one processor, regardless of the configuration setting.

Im Folgenden finden Sie Überlegungen zu Threading und Leistung der Garbage Collection auf Servern:The following are threading and performance considerations for server garbage collection:

  • Die Garbage Collection erfolgt auf mehreren dedizierten Threads, die mit der Prioritätsebene THREAD_PRIORITY_HIGHEST ausgeführt werden.The collection occurs on multiple dedicated threads that are running at THREAD_PRIORITY_HIGHEST priority level.

  • Für jede CPU werden ein Heap und ein dedizierter Thread zum Ausführen der Garbage Collection bereitgestellt, und die Auflistung für die Heaps findet zur gleichen Zeit statt.A heap and a dedicated thread to perform garbage collection are provided for each CPU, and the heaps are collected at the same time. Jeder Heap enthält einen kleinen Objektheap und einen großen Objektheap, und auf alle Heaps kann über den Benutzercode zugegriffen werden.Each heap contains a small object heap and a large object heap, and all heaps can be accessed by user code. Objekte auf verschiedenen Heaps können aufeinander verweisen.Objects on different heaps can refer to each other.

  • Da mehrere Garbage Collection-Threads zusammenarbeiten, ist die Garbage Collection auf dem Server bei gleicher Heapgröße schneller als die Garbage Collection für die Arbeitsstation.Because multiple garbage collection threads work together, server garbage collection is faster than workstation garbage collection on the same size heap.

  • Bei der Garbage Collection auf dem Server sind die Segmente häufig größer.Server garbage collection often has larger size segments. Dies ist jedoch nur eine allgemeine Angabe: Die Segmentgröße ist implementierungsspezifisch und unterliegt möglicherweise Änderungen.However, this is only a generalization: segment size is implementation-specific and is subject to change. Wenn Sie eine Anwendung optimieren, sollten Sie keine Annahmen über die Größe der Segmente machen, die vom Garbage Collector zugeordnet werden.Don't make assumptions about the size of segments allocated by the garbage collector when tuning your app.

  • Die Garbage Collection auf dem Server kann ressourcenintensiv sein.Server garbage collection can be resource-intensive. Nehmen Sie beispielsweise an, dass auf einem Computer mit vier Prozessoren zwölf Prozesse vorhanden sind, in denen die Garbage Collection auf dem Server ausgeführt wird.For example, imagine that there are 12 processes that use server GC running on a computer that has 4 processors. Wenn alle Prozesse die Garbage Collection gleichzeitig durchführen, würden sie sich gegenseitig behindern, da auf demselben Prozessor zwölf Threads geplant würden.If all the processes happen to collect garbage at the same time, they would interfere with each other, as there would be 12 threads scheduled on the same processor. Wenn die Prozesse aktiv sind, ist es nicht empfehlenswert, dass sie alle die Garbage Collection auf dem Server verwenden.If the processes are active, it's not a good idea to have them all use server GC.

Wenn Sie Hunderte von Instanzen einer Anwendung ausführen, sollten Sie erwägen, eine Garbage Collection für die Arbeitsstation mit deaktivierter gleichzeitiger Garbage Collection zu verwenden.If you're running hundreds of instances of an application, consider using workstation garbage collection with concurrent garbage collection disabled. Dies führt zu weniger Kontextwechseln, wodurch die Leistung verbessert werden kann.This will result in less context switching, which can improve performance.

Garbage Collection auf Arbeitsstationen im HintergrundBackground workstation garbage collection

Bei der Garbage Collection im Hintergrund auf Arbeitsstationen werden kurzlebige Generationen (0 und 1) bei Bedarf bereinigt, während die Garbage Collection von Generation 2 ausgeführt wird.In background workstation garbage collection, ephemeral generations (0 and 1) are collected as needed while the collection of generation 2 is in progress. Die Garbage Collection auf Arbeitsstationen im Hintergrund wird auf einem dedizierten Thread ausgeführt und betrifft nur die Garbage Collections der Generation 2.Background workstation garbage collection is performed on a dedicated thread and applies only to generation 2 collections.

Die Garbage Collection im Hintergrund ist standardmäßig aktiviert und kann mit der Konfigurationseinstellung gcConcurrent in .NET Framework-Apps oder der Einstellung System.GC.Concurrent in .NET Core-Apps aktiviert oder deaktiviert werden.Background garbage collection is enabled by default and can be enabled or disabled with the gcConcurrent configuration setting in .NET Framework apps or the System.GC.Concurrent setting in .NET Core apps.

Hinweis

Ab .NET Framework 4 ersetzt die Garbage Collection im Hintergrund die gleichzeitige Garbage Collection.Background garbage collection replaces concurrent garbage collection and is available in .NET Framework 4 and later versions. In .NET Framework 4 wird sie nur für die Garbage Collection für Arbeitsstationen unterstützt.In .NET Framework 4, it's supported only for workstation garbage collection. Ab .NET Framework 4.5 ist die Garbage Collection im Hintergrund für Arbeitsstationen und Server verfügbar.Starting with .NET Framework 4.5, background garbage collection is available for both workstation and server garbage collection.

Eine Garbage Collection für kurzlebige Generationen, die während der Garbage Collection im Hintergrund stattfindet, wird als Garbage Collection im Vordergrund bezeichnet.A collection on ephemeral generations during background garbage collection is known as foreground garbage collection. Wenn Garbage Collections im Vordergrund stattfinden, werden alle verwalteten Threads angehalten.When foreground garbage collections occur, all managed threads are suspended.

Wenn eine Garbage Collection im Hintergrund ausgeführt wird und Sie genügend Objekte in Generation 0 zugeordnet haben, führt die CLR eine Garbage Collection der Generation 0 oder der Generation 1 im Vordergrund aus.When background garbage collection is in progress and you've allocated enough objects in generation 0, the CLR performs a generation 0 or generation 1 foreground garbage collection. Der dedizierte Thread der Garbage Collection im Hintergrund prüft häufig, ob eine Anforderung für die Garbage Collection im Vordergrund besteht.The dedicated background garbage collection thread checks at frequent safe points to determine whether there is a request for foreground garbage collection. Trifft dies zu, wird die Garbage Collection im Hintergrund angehalten, damit die Garbage Collection im Vordergrund stattfinden kann.If there is, the background collection suspends itself so that foreground garbage collection can occur. Nachdem die Garbage Collection im Vordergrund abgeschlossen wurde, werden der dedizierte Thread der Garbage Collection im Hintergrund und die Benutzerthreads fortgesetzt.After the foreground garbage collection is completed, the dedicated background garbage collection thread and user threads resume.

Die Garbage Collection im Hintergrund beseitigt die von der gleichzeitigen Garbage Collection auferlegten Speicherbelegungseinschränkungen, da kurzlebige Garbage Collections während der Garbage Collection im Hintergrund stattfinden können.Background garbage collection removes allocation restrictions imposed by concurrent garbage collection, because ephemeral garbage collections can occur during background garbage collection. Mit der Garbage Collection im Hintergrund können inaktive Objekte in kurzlebigen Generationen entfernt werden.Background garbage collection can remove dead objects in ephemeral generations. Ferner kann der Heap bei Bedarf während einer Garbage Collection der Generation 1 erweitert werden.It can also expand the heap if needed during a generation 1 garbage collection.

Die folgende Abbildung zeigt eine Garbage Collection im Hintergrund für einen separaten dedizierten Thread auf einer Arbeitsstation:The following illustration shows background garbage collection performed on a separate dedicated thread on a workstation:

Garbage Collection auf Arbeitsstationen im Hintergrund

Garbage Collection auf dem Server im HintergrundBackground server garbage collection

Ab .NET Framework 4.5 ist die Garbage Collection im Hintergrund der Standardmodus für die Garbage Collection auf dem Server.Starting with .NET Framework 4.5, background server garbage collection is the default mode for server garbage collection.

Die Garbage Collection im Hintergrund auf dem Server ähnelt der im vorherigen Abschnitt beschriebenen Garbage Collection im Hintergrund auf einer Arbeitsstation, es gibt jedoch einige Unterschiede:Background server garbage collection functions similarly to background workstation garbage collection, described in the previous section, but there are a few differences:

  • Die Garbage Collection im Hintergrund auf der Arbeitsstation verwendet einen dedizierten Thread für die Garbage Collection im Hintergrund, während die Garbage Collection im Hintergrund auf dem Server mehrere Threads verwendet.Background workstation garbage collection uses one dedicated background garbage collection thread, whereas background server garbage collection uses multiple threads. In der Regel wird ein dedizierter Thread für jeden logischen Prozessor verwendet.Typically, there's a dedicated thread for each logical processor.

  • Anders als der Garbage Collection-Thread im Hintergrund auf einer Arbeitsstation tritt bei diesen Threads kein Timeout auf.Unlike the workstation background garbage collection thread, these threads do not time out.

Die folgende Abbildung zeigt eine Garbage Collection im Hintergrund für einen separaten dedizierten Thread auf einem Server:The following illustration shows background garbage collection performed on a separate dedicated thread on a server:

Garbage Collection auf dem Server im Hintergrund

Concurrent garbage collectionConcurrent garbage collection

Tipp

Dieser Abschnitt gilt für:This section applies to:

  • .NET Framework 3.5 und früher für die Garbage Collection für Arbeitsstationen.NET Framework 3.5 and earlier for workstation garbage collection
  • .NET Framework 4 und früher für die Garbage Collection auf dem Server.NET Framework 4 and earlier for server garbage collection

Die gleichzeitige Garbage Collection wird in späteren Versionen durch die Garbage Collection im Hintergrund ersetzt.Concurrent garbage is replaced by background garbage collection in later versions.

Bei der Garbage Collection für Arbeitsstationen oder Server können Sie die gleichzeitige Garbage Collection aktivieren. Diese ermöglicht die gleichzeitige Ausführung von Threads mit einem dedizierten Thread, der die Garbage Collection nahezu die ganze Zeit ausführt.In workstation or server garbage collection, you can enable concurrent garbage collection, which enables threads to run concurrently with a dedicated thread that performs the garbage collection for most of the duration of the collection. Diese Option wirkt sich nur auf Garbage Collections in Generation 2 aus; in Generation 0 und 1 finden keine gleichzeitigen Garbage Collections statt, da sie sehr schnell beendet werden.This option affects only garbage collections in generation 2; generations 0 and 1 are always non-concurrent because they finish very fast.

Dank der gleichzeitigen Garbage Collection ist die Reaktionsfähigkeit interaktiver Anwendungen besser, da die für die Garbage Collection notwendigen Pausen minimiert werden.Concurrent garbage collection enables interactive applications to be more responsive by minimizing pauses for a collection. Verwaltete Threads können weiterhin die meiste Zeit ausgeführt werden, während der Thread der gleichzeitigen Garbage Collection ausgeführt wird.Managed threads can continue to run most of the time while the concurrent garbage collection thread is running. Dies verkürzt die Pausen während einer Garbage Collection.This results in shorter pauses while a garbage collection is occurring.

Die gleichzeitige Garbage Collection wird auf einem dedizierten Thread ausgeführt.Concurrent garbage collection is performed on a dedicated thread. Standardmäßig führt die CLR die Garbage Collection für die Arbeitsstation mit aktivierter gleichzeitiger Garbage Collection aus.By default, the CLR runs workstation garbage collection with concurrent garbage collection enabled. Dies gilt für Einzelprozessor- und für Mehrprozessorcomputer.This is true for single-processor and multi-processor computers.

Die folgende Abbildung zeigt eine parallele Garbage Collection für einen separaten dedizierten Thread.The following illustration shows concurrent garbage collection performed on a separate dedicated thread.

Threads für parallele Garbage Collection

Siehe auchSee also