Automatic Memory ManagementAutomatic Memory Management

Bei der automatischen Speicherverwaltung handelt es sich um einen Dienst, der von der Common Language Runtime während der verwalteten Ausführung zur Verfügung gestellt wird.Automatic memory management is one of the services that the Common Language Runtime provides during Managed Execution. Der Garbage Collector der Common Language Runtime verwaltet die Belegung und Freigabe von Arbeitsspeicher für eine Anwendung.The Common Language Runtime's garbage collector manages the allocation and release of memory for an application. Das bedeutet, dass beim Entwickeln verwalteter Anwendungen kein Code für Aufgaben der Speicherverwaltung geschrieben werden muss.For developers, this means that you do not have to write code to perform memory management tasks when you develop managed applications. Mithilfe der automatischen Speicherverwaltung können häufig auftretende Probleme beseitigt werden, z. B. wenn ein Objekt versehentlich nicht freigegeben wurde und dadurch Speicherverluste entstehen oder wenn auf den Speicher für ein Objekt zugegriffen wird, das bereits freigegeben wurde.Automatic memory management can eliminate common problems, such as forgetting to free an object and causing a memory leak, or attempting to access memory for an object that has already been freed. In diesem Abschnitt wird beschrieben, wie Sie den Garbage Collector zum Belegen und Freigeben von Arbeitsspeicher verwenden können.This section describes how the garbage collector allocates and releases memory.

SpeicherbelegungAllocating Memory

Wenn Sie einen neuen Prozess initialisieren, wird diesem durch die Common Language Runtime ein zusammenhängender Adressraum reserviert.When you initialize a new process, the runtime reserves a contiguous region of address space for the process. Dieser reservierte Adressraum wird als verwalteter Heap bezeichnet.This reserved address space is called the managed heap. Im verwalteten Heap steht ein Zeiger zur Verfügung, der auf die Adresse des nächsten im Heap zu speichernden Objekts zeigt.The managed heap maintains a pointer to the address where the next object in the heap will be allocated. Anfangs ist dieser Zeiger auf die Basisadresse des verwalteten Heaps eingestellt.Initially, this pointer is set to the managed heap's base address. Alle Referenztypen werden im verwalteten Heap zugewiesen.All reference types are allocated on the managed heap. Wurde von einer Anwendung der erste Referenztyp erstellt, wird für diesen Typ an der Basisadresse des verwalteten Heaps Speicherplatz belegt.When an application creates the first reference type, memory is allocated for the type at the base address of the managed heap. Wenn das nächste Objekt von der Anwendung erstellt wird, belegt der Garbage Collector Speicherplatz im Adressraum direkt hinter dem ersten Objekt.When the application creates the next object, the garbage collector allocates memory for it in the address space immediately following the first object. Solange ein Adressbereich verfügbar ist, fährt der Garbage Collector auf diese Weise mit der Belegung von Arbeitsspeicher für neue Objekte fort.As long as address space is available, the garbage collector continues to allocate space for new objects in this manner.

Das Belegen von Speicher im verwalteten Heap beansprucht weniger Zeit als die nicht verwaltete Speicherbelegung.Allocating memory from the managed heap is faster than unmanaged memory allocation. Da durch die Common Language Runtime Speicher für ein Objekt durch Hinzufügen eines Werts zu einem Zeiger belegt wird, ist diese Methode fast so schnell wie das Reservieren von Speicher im Stapel.Because the runtime allocates memory for an object by adding a value to a pointer, it is almost as fast as allocating memory from the stack. Außerdem werden neue Objekte, für die Speicher reserviert wird, ständig nacheinander im verwalteten Heap gespeichert. Dadurch kann eine Anwendung auf diese Objekte sehr schnell zugreifen.In addition, because new objects that are allocated consecutively are stored contiguously in the managed heap, an application can access the objects very quickly.

Freigeben von ArbeitsspeicherReleasing Memory

Durch die Optimierungs-Engine des Garbage Collectors wird der beste Zeitpunkt für das Ausführen einer Garbage Collection bestimmt, die auf den erfolgten Speicherbelegungen basiert.The garbage collector's optimizing engine determines the best time to perform a collection based on the allocations being made. Beim Ausführen einer Garbage Collection wird Speicher freigegeben, den von der Anwendung nicht mehr benötigte Objekte beanspruchen.When the garbage collector performs a collection, it releases the memory for objects that are no longer being used by the application. Durch Überprüfen der Stammelemente der Anwendung wird ermittelt, welche Objekte nicht mehr verwendet werden.It determines which objects are no longer being used by examining the application's roots. Jede Anwendung verfügt über einen Satz von Stammelementen.Every application has a set of roots. Jedes Stammelement bezieht sich entweder auf ein Objekt im verwalteten Heap oder ist auf NULL festgelegt.Each root either refers to an object on the managed heap or is set to null. Die Stammelemente einer Anwendung beinhalten statische Felder, lokale Variablen und Parameter im Stapel des Threads sowie CPU-Register.An application's roots include static fields, local variables and parameters on a thread's stack, and CPU registers. Der Garbage Collector hat Zugriff auf eine Liste der aktiven Stammelemente, die vom JIT-Compiler (Just-In-Time) und der Common Language Runtime verwaltet wird.The garbage collector has access to the list of active roots that the just-in-time (JIT) compiler and the runtime maintain. Mithilfe dieser Liste werden die Stammelemente einer Anwendung durchsucht, und es wird ein Diagramm erstellt, in dem alle von den Stammelementen aus erreichbaren Objekte enthalten sind.Using this list, it examines an application's roots, and in the process creates a graph that contains all the objects that are reachable from the roots.

Objekte, die nicht in diesem Diagramm aufgeführt werden, können von den Stammelementen aus nicht erreicht werden.Objects that are not in the graph are unreachable from the application's roots. Diese nicht erreichbaren Objekte werden vom Garbage Collector als Abfall betrachtet, und der von diesen Objekten belegte Speicherplatz wird wieder freigegeben.The garbage collector considers unreachable objects garbage and will release the memory allocated for them. Während einer Garbage Collection wird der verwaltete Heap nach den Blöcken des Adressraums durchsucht, in denen sich nicht erreichbare Objekte befinden.During a collection, the garbage collector examines the managed heap, looking for the blocks of address space occupied by unreachable objects. Beim Auffinden dieser Objekte werden die erreichbaren Objekte mithilfe einer Speicherkopierfunktion im Speicher komprimiert, und die von den nicht erreichbaren Objekten belegten Blöcke des Adressraums werden freigegeben.As it discovers each unreachable object, it uses a memory-copying function to compact the reachable objects in memory, freeing up the blocks of address spaces allocated to unreachable objects. Nach dem Komprimieren des Speichers für die erreichbaren Objekte werden vom Garbage Collector die erforderlichen Korrekturen am Zeiger vorgenommen, sodass die Stammelemente der Anwendung auf die neuen Speicherorte der Objekte verweisen.Once the memory for the reachable objects has been compacted, the garbage collector makes the necessary pointer corrections so that the application's roots point to the objects in their new locations. Außerdem wird der Zeiger des verwalteten Heaps auf die Position hinter dem letzten erreichbaren Objekt gesetzt.It also positions the managed heap's pointer after the last reachable object. Beachten Sie, dass der Speicher nur dann komprimiert wird, wenn in der Garbage Collection eine signifikante Anzahl nicht erreichbarer Objekte gefunden wird.Note that memory is compacted only if a collection discovers a significant number of unreachable objects. Wenn nach einer Garbage Collection alle Objekte in einem verwalteten Heap verbleiben, bedarf es auch keiner Speicherkomprimierung.If all the objects in the managed heap survive a collection, then there is no need for memory compaction.

Um die Leistung zu verbessern, wird für große Objekte durch die Common Language Runtime Speicherplatz in einem separaten Heap belegt.To improve performance, the runtime allocates memory for large objects in a separate heap. Der Speicherplatz für große Objekte wird durch den Garbage Collector automatisch freigegeben.The garbage collector automatically releases the memory for large objects. Um das Verschieben großer Objekte im Speicher zu vermeiden, wird dieser Speicher jedoch nicht komprimiert.However, to avoid moving large objects in memory, this memory is not compacted.

Generationen und LeistungsfähigkeitGenerations and Performance

Zur Optimierung der Leistung des Garbage Collectors wird der verwaltete Heap in drei Generationen unterteilt: 0, 1 und 2.To optimize the performance of the garbage collector, the managed heap is divided into three generations: 0, 1, and 2. Der Garbage Collection-Algorithmus der Laufzeit basiert auf mehreren Verallgemeinerungen, die von der Computersoftwareindustrie durch Experimentieren mit Garbage Collection-Schemas als gültig erkannt wurden.The runtime's garbage collection algorithm is based on several generalizations that the computer software industry has discovered to be true by experimenting with garbage collection schemes. Erstens kann die Garbage Collection schneller ausgeführt werden, wenn der Speicher nur in einem Teil des verwalteten Heaps komprimiert wird und nicht im gesamten Heap.First, it is faster to compact the memory for a portion of the managed heap than for the entire managed heap. Zweitens ist die Lebensdauer von neueren Objekten kürzer als die von älteren Objekten.Secondly, newer objects will have shorter lifetimes and older objects will have longer lifetimes. Drittens tendieren neuere Objekte dazu, miteinander in Beziehung zu stehen, und die Anwendung greift etwa zur gleichen Zeit auf sie zu.Lastly, newer objects tend to be related to each other and accessed by the application around the same time.

Vom Garbage Collector der Laufzeit werden neue Objekte in Generation 0 gespeichert.The runtime's garbage collector stores new objects in generation 0. Objekte, die früh in der Lebensdauer der Anwendung erstellt wurden und nach den Garbage Collections noch vorhanden sind, werden höher gestuft und werden in Generationen 1 und 2 gespeichert.Objects created early in the application's lifetime that survive collections are promoted and stored in generations 1 and 2. Der Prozess der Objektheraufstufung wird weiter unten in diesem Thema beschrieben.The process of object promotion is described later in this topic. Da es weniger Zeit beansprucht, statt des gesamten verwalteten Heaps nur einen Teil davon zu komprimieren, ist es bei diesem Konzept auch möglich, bei einer Garbage Collection lediglich Speicher einer bestimmten Generationsstufe freizugeben und nicht den des gesamten verwalteten Heaps.Because it is faster to compact a portion of the managed heap than the entire heap, this scheme allows the garbage collector to release the memory in a specific generation rather than release the memory for the entire managed heap each time it performs a collection.

Tatsächlich wird eine Garbage Collection erst dann eingeleitet, wenn der Bereich von Generation 0 voll ist.In reality, the garbage collector performs a collection when generation 0 is full. Versucht eine Anwendung, ein neues Objekt zu erzeugen, und der Bereich der Generation 0 ist voll, wird vom Garbage Collector ermittelt, dass es in diesem Bereich keinen freien Adressraum mehr gibt, der dem neuen Objekt zugewiesen werden kann.If an application attempts to create a new object when generation 0 is full, the garbage collector discovers that there is no address space remaining in generation 0 to allocate for the object. Daraufhin wird eine Garbage Collection gestartet, um im Bereich der Generation 0 freien Adressraum zu schaffen.The garbage collector performs a collection in an attempt to free address space in generation 0 for the object. Dabei werden nur die Objekte im Bereich der Generation 0 untersucht und nicht alle Objekte im verwalteten Heap.The garbage collector starts by examining the objects in generation 0 rather than all objects in the managed heap. Das ist der effizienteste Weg, da neue Objekte zu einer kürzeren Lebensdauer tendieren. Es ist daher zu erwarten, dass beim Starten der Garbage Collection viele Objekte im Bereich der Generation 0 nicht mehr von der Anwendung benötigt werden.This is the most efficient approach, because new objects tend to have short lifetimes, and it is expected that many of the objects in generation 0 will no longer be in use by the application when a collection is performed. Außerdem liefert eine Garbage Collection im Bereich der Generation 0 oftmals ausreichend Speicherplatz, sodass von der Anwendung weitere neue Objekte erzeugt werden können.In addition, a collection of generation 0 alone often reclaims enough memory to allow the application to continue creating new objects.

Nach Durchführung einer Garbage Collection im Bereich der Generation 0 wird der Speicher für die erreichbaren Objekte komprimiert, wie weiter oben unter Freigeben von Arbeitsspeicher erläutert.After the garbage collector performs a collection of generation 0, it compacts the memory for the reachable objects as explained in Releasing Memory earlier in this topic. Der Garbage Collector stuft dann diese Objekte höher und betrachtet diesen Teil des verwalteten Heaps als Generation 1.The garbage collector then promotes these objects and considers this portion of the managed heap generation 1. Da Objekte, die nach Garbage Collections noch vorhanden sind, normalerweise längere Lebensdauern haben, ist es sinnvoll, sie auf eine höhere Generation heraufzustufen.Because objects that survive collections tend to have longer lifetimes, it makes sense to promote them to a higher generation. Auf diese Weise müssen die Objekte der Generationen 1 und 2 nicht bei jeder Garbage Collection, die für Objekte der Generation 0 durchgeführt wird, erneut vom Garbage Collector untersucht werden.As a result, the garbage collector does not have to reexamine the objects in generations 1 and 2 each time it performs a collection of generation 0.

Nachdem der Garbage Collector die erste Garbage Collection der Generation 0 ausgeführt und die erreichbaren Objekte auf Generation 1 hochgestuft hat, betrachtet er den Rest des verwalteten Heaps als Generation 0.After the garbage collector performs its first collection of generation 0 and promotes the reachable objects to generation 1, it considers the remainder of the managed heap generation 0. Er fährt fort, Speicher für neue Objekte in Generation 0 zu belegen, bis Generation 0 voll ist und eine weitere Garbage Collection ausgeführt werden muss.It continues to allocate memory for new objects in generation 0 until generation 0 is full and it is necessary to perform another collection. An diesem Punkt wird von der Optimierungs-Engine des Garbage Collectors ermittelt, ob auch die Objekte der älteren Generationen untersucht werden müssen.At this point, the garbage collector's optimizing engine determines whether it is necessary to examine the objects in older generations. Wenn eine Garbage Collection der Generation 0 z. B. nicht genug Arbeitsspeicher für die Anwendung freigibt, um das Erstellen eines neuen Objekts erfolgreich auszuführen, kann der Garbage Collector eine Garbage Collection der Generation 1, dann Generation 2, ausführen.For example, if a collection of generation 0 does not reclaim enough memory for the application to successfully complete its attempt to create a new object, the garbage collector can perform a collection of generation 1, then generation 2. Wenn so nicht genug Arbeitsspeicher freigegeben wird, kann der Garbage Collector eine Garbage Collection der Generationen 2, 1 und 0 ausführen.If this does not reclaim enough memory, the garbage collector can perform a collection of generations 2, 1, and 0. Nach jeder Garbage Collection komprimiert der Garbage Collector die erreichbaren Objekte in Generation 0 und stuft sie auf Generation 1 herauf.After each collection, the garbage collector compacts the reachable objects in generation 0 and promotes them to generation 1. Objekte in Generation 1, die nach den Garbage Collections noch vorhanden sind, werden auf Generation 2 hochgestuft.Objects in generation 1 that survive collections are promoted to generation 2. Da der Garbage Collector nur drei Generationen unterstützt, bleiben Objekte in Generation 2, die nach einer Garbage Collection noch vorhanden sind, in Generation 2, bis sie in einer späteren Garbage Collection als nicht erreichbar erkannt werden.Because the garbage collector supports only three generations, objects in generation 2 that survive a collection remain in generation 2 until they are determined to be unreachable in a future collection.

Freigeben von Speicher für nicht verwaltete RessourcenReleasing Memory for Unmanaged Resources

Für die meisten von einer Anwendung erzeugten Objekte führt der Garbage Collector alle Aufgaben der Speicherverwaltung automatisch aus.For the majority of the objects that your application creates, you can rely on the garbage collector to automatically perform the necessary memory management tasks. Allerdings ist bei nicht verwalteten Ressourcen explizites Bereinigen erforderlich.However, unmanaged resources require explicit cleanup. Die häufigsten nicht verwalteten Ressourcen sind Objekte, die eine Betriebssystemressource umschließen, z. B. ein Dateihandle, ein Fensterhandle oder eine Netzwerkverbindung.The most common type of unmanaged resource is an object that wraps an operating system resource, such as a file handle, window handle, or network connection. Obwohl der Garbage Collector die Lebensdauer eines verwalteten Objekts, das eine nicht verwaltete Ressource kapselt, verfolgen kann, stehen ihm keine genauen Informationen zum Bereinigen dieser Ressource zur Verfügung.Although the garbage collector is able to track the lifetime of a managed object that encapsulates an unmanaged resource, it does not have specific knowledge about how to clean up the resource. Wenn Sie ein Objekt erstellen möchten, das eine nicht verwaltete Ressource kapselt, ist es ratsam, Code zum Bereinigen der nicht verwalteten Ressource in einer öffentlichen Dispose-Methode bereitzustellen.When you create an object that encapsulates an unmanaged resource, it is recommended that you provide the necessary code to clean up the unmanaged resource in a public Dispose method. Durch Bereitstellen der Dispose-Methode wird Benutzern des Objekts die Möglichkeit gegeben, nicht mehr benötigten Speicherplatz explizit freizugeben, sobald das Objekt nicht mehr verwendet wird.By providing a Dispose method, you enable users of your object to explicitly free its memory when they are finished with the object. Wenn Sie ein Objekt verwenden, das eine nicht verwaltete Ressource kapselt, sollten Sie die Dispose-Methode beachten und bei Bedarf aufrufen.When you use an object that encapsulates an unmanaged resource, you should be aware of Dispose and call it as necessary. Weitere Informationen zum Bereinigen nicht verwalteter Ressourcen und ein Beispiel für ein Entwurfsmuster zum Implementieren von Dispose finden Sie unter Garbage CollectionFor more information about cleaning up unmanaged resources and an example of a design pattern for implementing Dispose, see Garbage Collection.

Siehe auchSee Also

GC
Garbage CollectionGarbage Collection
Der verwaltete AusführungsprozessManaged Execution Process