Grundlagen der Garbage CollectionFundamentals of Garbage Collection

In der Common Language Runtime (CLR) dient der Garbage Collector als automatischer Speicher-Manager.In the common language runtime (CLR), the garbage collector 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 freigeben zu müssen.Enables you to develop your application without having to 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 Thema werden die wichtigsten Konzepte der Garbage Collection beschrieben.This topic describes the core concepts of garbage collection. Es enthält die folgenden Abschnitte:It contains the following sections:

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 share 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 systemeigenen Code schreiben, verwenden Sie die Win32-Funktionen für die Arbeit mit dem virtuellen Adressraum.If you are writing native code, you use Win32 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 you run out of 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.Your 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 your 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 is needed, so it is possible to encounter paging in situations where the physical memory pressure is very low.

Zurück zum AnfangBack to top

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 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.

Zurück zum AnfangBack to top

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-Win32-Funktion auf und reserviert jeweils ein Segment des Speichers für verwaltete Anwendungen.To reserve memory, the garbage collector calls the Win32 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-Win32-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 Win32 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.

Zurück zum AnfangBack to top

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. Hierbei handelt es sich implizit um Auflistungen der Generation 0, sofern es keine großen Objekte sind. In diesem Fall gehören Sie zum großen Objektheap in einer Auflistung der Generation 2.Newly allocated objects form a new generation of objects and are implicitly generation 0 collections, unless they are large objects, in which case 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 is 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 werden 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 beibehaltenden Objekte in einer Generation hoch ist, erhöht er den Schwellenwert von Speicherbelegungen für diese Generation, sodass bei der nächsten Garbage Collection eine beträchtliche Menge an Speicher freigegeben wird.When the garbage collector detects that the survival rate is high in a generation, it increases the threshold of allocations for that generation, so 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 nicht zu groß werden, und zum anderen soll die Garbage Collection nicht zu viel Zeit in Anspruch nehmen.The CLR continually balances two priorities: not letting an application's working set get too big and not letting the garbage collection take too much time.

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- oder 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- 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.

Zurück zum AnfangBack to top

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 nicht komprimiert, da das Kopieren großer Objekte Leistungseinbußen zur Folge hat.Ordinarily, the large object heap is not compacted, because copying large objects imposes a performance penalty. Ab .NET Framework 4.5.1.NET Framework 4.5.1 können Sie jedoch die GCSettings.LargeObjectHeapCompactionMode-Eigenschaft verwenden, um bei Bedarf einen großen Objektheap zu komprimieren.However, starting with the .NET Framework 4.5.1.NET Framework 4.5.1, you can use the GCSettings.LargeObjectHeapCompactionMode property to compact the large object heap on demand.

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.

  • 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 wirdWhen a thread triggers a Garbage Collection
Ein Thread, der eine Garbage Collection auslöstThread that triggers a garbage collection

Zurück zum AnfangBack to top

Bearbeiten von nicht verwalteten RessourcenManipulating unmanaged resources

Wenn die verwalteten Objekte mit ihren systemeigenen 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 your managed objects reference unmanaged objects by using their native file handles, you have to explicitly free the unmanaged objects, because the garbage collector tracks memory only on the managed heap.

Benutzer des verwalteten Objekts geben möglicherweise nicht die systemeigenen Ressourcen frei, die vom Objekt verwendet werden.Users of your 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 your managed object finalizable. Der Abschluss umfasst Bereinigungsaktionen, die Sie ausführen, wenn das Objekt nicht mehr verwendet wird.Finalization consists of cleanup actions that you 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 your 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.

Zurück zum AnfangBack to top

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:

  • Garbage Collection für die Arbeitsstation, die für alle Clientarbeitsstationen und eigenständigen Computer vorgesehen ist.Workstation garbage collection, which is for all client workstations and stand-alone PCs. Dies ist die Standardeinstellung für das <gcServer>-Element im Laufzeitkonfigurationsschema.This is the default setting for the <gcServer> element in the runtime configuration schema.

    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.NET Framework 4wird die gleichzeitige Garbage Collection durch die Garbage Collection im Hintergrund ersetzt.Starting with the .NET Framework 4.NET Framework 4, background garbage collection replaces concurrent garbage collection.

  • 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. Garbage Collection auf dem Server kann nicht-gleichzeitig oder im Hintergrund durchgeführt werden.Server garbage collection can be non-concurrent or background.

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

Garbage Collection-Threads auf dem ServerServer Garbage Collection Threads
Garbage Collection für ServerServer garbage collection

Konfigurieren der Garbage CollectionConfiguring garbage collection

Sie können das <gcServer>-Element des Laufzeitkonfigurationsschemas verwenden, um den Typ der Garbage Collection anzugeben, der von der CLR ausgeführt werden soll.You can use the <gcServer> element of the runtime configuration schema to specify the type of garbage collection you want the CLR to perform. Wenn das enabled -Attribut dieses Elements auf false (die Standardeinstellung) festgelegt wird, führt die CLR die Garbage Collection für die Arbeitsstation aus.When this element's enabled attribute is set to false (the default), the CLR performs workstation garbage collection. Wenn Sie das enabled -Attribut auf truefestlegen, führt die CLR die Garbage Collection auf dem Server aus.When you set the enabled attribute to true, the CLR performs server garbage collection.

Die parallel ausgeführte Garbage Collection wird mit dem <gcConcurrent>-Element des Laufzeitkonfigurationsschemas angegeben.Concurrent garbage collection is specified with the <gcConcurrent> element of the runtime configuration schema. Die Standardeinstellung ist enabled.The default setting is enabled. Diese Einstellung steuert sowohl die gleichzeitige Garbage Collection als auch die Garbage Collection im Hintergrund.This setting controls both concurrent and background garbage collection.

Sie können die Garbage Collection auf dem Server auch mit nicht verwalteten Hostingschnittstellen angeben.You can also specify server garbage collection with unmanaged hosting interfaces. Beachten Sie, dass ASP.NET und SQL Server automatisch die Garbage Collection auf dem Server aktivieren, wenn die Anwendung in einer dieser Umgebungen gehostet wird.Note that ASP.NET and SQL Server enable server garbage collection automatically if your application is hosted inside one of these environments.

Vergleich der Garbage Collection auf Arbeitsstation und ServerComparing 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 systemeigenen Code ausführen, werden nicht angehalten.Threads that are running native code are not suspended.

  • Die Garbage Collection für die Arbeitsstation wird immer auf einem Computer verwendet, der nur einen Prozessor besitzt, unabhängig von der <gcServer>-Einstellung.Workstation garbage collection is always used on a computer that has only one processor, regardless of the <gcServer> setting. Wenn Sie angeben, dass die Garbage Collection auf dem Server erfolgen soll, verwendet die CLR die Garbage Collection für Arbeitsstationen mit deaktivierter Parallelität.If you specify server garbage collection, the CLR uses workstation garbage collection with concurrency disabled.

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. Beachten Sie jedoch, dass dies nur eine Verallgemeinerung ist: Die Segmentgröße ist implementierungsspezifisch und unterliegt möglicherweise Änderungen.Note, however, that 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 voraussetzen, die vom Garbage Collector zugeordnet werden.You should make no 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. Wenn Sie z. B. 12 Prozesse haben, die auf einem Computer mit vier Prozessoren ausgeführt werden, gibt es 48 dedizierte Garbage Collection-Threads, wenn alle die Garbage Collection auf dem Server verwenden.For example, if you have 12 processes running on a computer that has 4 processors, there will be 48 dedicated garbage collection threads if they are all using server garbage collection. In einer Situation mit hoher Speicherlast, wenn alle Prozesse eine Garbage Collection starten, muss der Garbage Collector 48 Threads einplanen.In a high memory load situation, if all the processes start doing garbage collection, the garbage collector will have 48 threads to schedule.

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 are 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.

Zurück zum AnfangBack to top

Concurrent garbage collectionConcurrent garbage collection

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 fast 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.

Um die Leistung zu verbessern, wenn mehrere Prozesse ausgeführt werden, deaktivieren Sie die gleichzeitige Garbage Collection.To improve performance when several processes are running, disable concurrent garbage collection. Sie erreichen dies, indem Sie der Konfigurationsdatei der App ein <gcConcurrent>-Element hinzufügen und dessen enabled-Attribut auf "false" festlegen.You can do this by adding a <gcConcurrent> element to the app's configuration file and setting the value of its enabled attribute to "false".

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 Fähigkeit, während einer gleichzeitigen Garbage Collection kleine Objekte auf dem Heap zuzuordnen, wird von den Objekten beschränkt, die im kurzlebigen Segment verbleiben, wenn eine gleichzeitige Garbage Collection gestartet wird.Your ability to allocate small objects on the heap during a concurrent garbage collection is limited by the objects left on the ephemeral segment when a concurrent garbage collection starts. Sobald Sie das Ende des Segments erreichen, müssen Sie warten, bis die gleichzeitige Garbage Collection beendet wird, während verwaltete Threads, die kleine Objektzuordnungen vornehmen müssen, angehalten werden.As soon as you reach the end of the segment, you will have to wait for the concurrent garbage collection to finish while managed threads that have to make small object allocations are suspended.

Die gleichzeitige Garbage Collection hat ein etwas größeres Workingset (verglichen mit der nicht gleichzeitigen Garbage Collection), da Sie während der gleichzeitigen Garbage Collection Objekte zuordnen können.Concurrent garbage collection has a slightly bigger working set (compared with non-concurrent garbage collection), because you can allocate objects during concurrent collection. Dies kann jedoch die Leistung beeinträchtigen, da die Objekte, die Sie zuordnen, Teil des Workingsets werden.However, this can affect performance, because the objects that you allocate become part of your working set. Im Grunde werden bei der gleichzeitigen Garbage Collection die etwas höhere CPU- und Arbeitsspeicherlast gegen kürzere Pausen eingetauscht.Essentially, concurrent garbage collection trades some CPU and memory for shorter pauses.

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 CollectionConcurrent Garbage Collection Threads
Concurrent garbage collectionConcurrent garbage collection

Zurück zum AnfangBack to top

Garbage Collection auf Arbeitsstationen im HintergrundBackground workstation garbage collection

Bei der Garbage Collection im Hintergrund werden kurzlebige Generationen (0 und 1) bei Bedarf bereinigt, während die Garbage Collection von Generation 2 ausgeführt wird.In background garbage collection, ephemeral generations (0 and 1) are collected as needed while the collection of generation 2 is in progress. Es gibt keine Einstellung für die Garbage Collection im Hintergrund. Sie wird automatisch mit der gleichzeitigen Garbage Collection aktiviert.There is no setting for background garbage collection; it is automatically enabled with concurrent garbage collection. Die Garbage Collection im Hintergrund ist ein Ersatz für die gleichzeitige Garbage Collection.Background garbage collection is a replacement for concurrent garbage collection. Wie auch die gleichzeitige Garbage Collection wird die Garbage Collection im Hintergrund auf einem dedizierten Thread ausgeführt und ist nur für Garbage Collections der Generation 2 zulässig.As with concurrent garbage collection, background garbage collection is performed on a dedicated thread and is applicable only to generation 2 collections.

Hinweis

Die Garbage Collection im Hintergrund ist nur in .NET Framework 4.NET Framework 4 und höheren Versionen verfügbar.Background garbage collection is available only in the .NET Framework 4.NET Framework 4 and later versions. In .NET Framework 4.NET Framework 4wird sie nur für die Garbage Collection auf Arbeitsstationen unterstützt.In the .NET Framework 4.NET Framework 4, it is supported only for workstation garbage collection. Ab .NET Framework 4.5 ist die Garbage Collection im Hintergrund für Arbeitsstation und Server verfügbar.Starting with the .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 have 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. Dies bedeutet, dass die Garbage Collection im Hintergrund inaktive Objekte in kurzlebigen Generationen entfernen und auch den Heap erweitern kann, falls dies während einer Garbage Collection in Generation 1 erforderlich ist.This means that background garbage collection can remove dead objects in ephemeral generations and 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 HintergrundBackground workstation garbage collection
Garbage Collection auf Arbeitsstationen im HintergrundBackground workstation garbage collection

Zurück zum AnfangBack to top

Garbage Collection auf dem Server im HintergrundBackground server garbage collection

Ab .NET Framework 4.5 ist Garbage Collection im Hintergrund der Standardmodus für die Garbage Collection auf dem Server.Starting with the .NET Framework 4.5, background server garbage collection is the default mode for server garbage collection. Zum Auswählen dieses Modus legen Sie das enabled-Attribut des <gcServer>-Elements auf true im Laufzeitkonfigurationsschema fest.To choose this mode, set the enabled attribute of the <gcServer> element to true in the runtime configuration schema. Dieser Modus funktioniert ähnlich der Garbage Collection im Hintergrund auf einer Arbeitsstation, die im vorherigen Abschnitt beschreiben wurde, es gibt jedoch einige Unterschiede.This mode 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, in der Regel einen dedizierter Thread für jeden logischen Prozessor.Background workstation garbage collection uses one dedicated background garbage collection thread, whereas background server garbage collection uses multiple threads, typically 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 HintergrundBackground server garbage collection
Garbage Collection auf dem Server im HintergrundBackground server garbage collection

Siehe auchSee Also

Garbage CollectionGarbage Collection