Stapel
Das stack
ist ein Speicherblock zum Speichern local variables
und parameters
. Der Stapel wächst und schrumpft logischerweise, wenn eine Funktion eingegeben und beendet wird.
Betrachten Sie die folgende Methode:
public static int Factorial (int x)
{
if (x == 0)
{
return 1;
}
return x * Factorial (x - 1);
}
Diese Methode ist rekursiv, dh sie ruft sich selbst auf. Jedes Mal, wenn die Methode eingegeben wird, wird ein neues int auf dem Stapel zugewiesen , und jedes Mal , wenn die Methode beendet wird, wird das int freigegeben .
Haufen
- Der Heap ist ein Speicherblock, in dem sich
objects
(dh reference-type instances
) befindet. Jedes Mal, wenn ein neues Objekt erstellt wird, wird es auf dem Heap zugewiesen und ein Verweis auf dieses Objekt wird zurückgegeben. Während der Ausführung eines Programms füllt sich der Heap, wenn neue Objekte erstellt werden. Die Laufzeit verfügt über einen Garbage Collector, der regelmäßig die Zuordnung von Objekten vom Heap aufhebt, sodass Ihr Programm nicht ausgeführt wird Out Of Memory
. Ein Objekt kann freigegeben werden, sobald es von nichts selbst referenziert wird alive
.
- Der Haufen speichert auch
static fields
. Im Gegensatz zu Objekten, die auf dem Heap zugeordnet sind (die durch Müll gesammelt werden können) these live until the application domain is torn down
.
Betrachten Sie die folgende Methode:
using System;
using System.Text;
class Test
{
public static void Main()
{
StringBuilder ref1 = new StringBuilder ("object1");
Console.WriteLine (ref1);
StringBuilder ref2 = new StringBuilder ("object2");
StringBuilder ref3 = ref2;
Console.WriteLine (ref3);
}
}
Im obigen Beispiel erstellen wir zunächst ein StringBuilder-Objekt, auf das die Variable ref1 verweist, und schreiben dann dessen Inhalt aus. Dieses StringBuilder-Objekt ist dann sofort für die Speicherbereinigung berechtigt, da es anschließend von nichts verwendet wird. Anschließend erstellen wir einen weiteren StringBuilder, auf den durch die Variable ref2 verwiesen wird, und kopieren diesen Verweis auf ref3. Obwohl ref2 nach diesem Zeitpunkt nicht mehr verwendet wird, behält ref3 dasselbe StringBuilder-Objekt bei. So wird sichergestellt, dass es erst nach Abschluss von ref3 für die Erfassung geeignet ist.
Wertinstanzen (und Objektreferenzen) leben überall dort, wo die Variable deklariert wurde. Wenn die Instanz als Feld innerhalb eines Klassentyps oder als Array-Element deklariert wurde, befindet sich diese Instanz auf dem Heap.