Wo speichert CLR statische Klassen?

7

Hier sind viele Leute verwirrt,

Normale Klasse speichert ihre Daten im Heap richtig? Und die Referenz (Zeiger) auf den Stapel.

Wenn der Stapel außerhalb des Gültigkeitsbereichs liegt, tritt das nächste Mal der Garbage Collector ein und entfernt den Speicher aus dem Heap.

Im Fall von statischen Klassen kann der Speicher vom Garbage Collector nicht sauber gemacht werden, da das ganze Programm da sein muss. Und es gibt keine Möglichkeit, die Referenz überhaupt zu bekommen.

Also, wenn wir Console anrufen. Zum Beispiel schreiben? Woher bezieht das Programm seine Referenz ( Wo speichert es den Verweis auf die statische Klasse )? Oder es nennt es nur direkt, aber wie?

    
Athiwat Chunlakhan 24.08.2009, 19:46
quelle

2 Antworten

16

Ich denke, Sie verwechseln Klassen mit , wobei der Speicher mit wie der Speicher belegt ist. Wenn Sie eine Instanz einer normalen Klasse erstellen, befindet sich der Speicher dieser Instanz auf dem Heap. Ein Verweis auf diese Instanz kann sich in einem Objekt auf dem Heap befinden (wenn Sie eine Mitgliedsvariable innerhalb einer anderen Instanz eines Objekts festlegen); oder eine Stapelvariable (wenn Sie eine Variable für das Objekt innerhalb einer Methode deklariert oder an einen Funktionsaufruf übergeben haben) oder in der Liste globaler Wurzeln (wenn es sich um eine statische Referenz handelt, z. B. eine Singleton-Referenz).

Eine statische Klasse kann nicht instanziiert werden. Es gibt keine "Referenz" auf die Klasse (außer Typinformationen). Seine Methoden sind nur Funktionen, die in den Speicher geladen werden, wenn die CLR die Assembly lädt. Sie könnten einen Delegaten erstellen, der auf eine dieser Methoden verweist, aber auch keinen Verweis auf eine Instanz der Klasse. Das ist nur ein Zeiger auf eine Funktion.

Sieh dir beispielsweise diesen Code an:

%Vor%

Die Main-Methode erstellt eine Instanz einer ObjectWrapper-Klasse. Diese Instanz befindet sich auf dem Heap.

Innerhalb der ObjectWrapper-Instanz gibt es eine Instanz der Klasse Object, die sich auf dem Heap befindet. Der Verweis auf diese Klasse befindet sich in der Instanz, also könnte man sich die Referenz als "im Heap leben" vorstellen.

Vergleichen Sie das nun mit dem folgenden Code:

%Vor%

Die Instanz des Singleton-Objekts befindet sich auch auf dem Heap. Die Referenz ist jedoch eine statische Referenz. Es wird von der CLR in einer Liste von globalen oder "root" -Referenzen verwaltet.

Sehen Sie sich nun diese statische Klasse an:

%Vor%

HelperMethods ist eine statische Klasse. Sie können die HelperMethods-Klasse nicht instanziieren. Es dürfen keine Objekte dieser Klasse auf dem Heap vorhanden sein. In der DoSomethingUseful-Methode hat es jedoch zwei Verweise auf eine Instanz der ObjectWrapper-Klasse im Stapel. Eins wird übergeben, und man wird innerhalb der Methode deklariert.

    
Paul Williams 24.08.2009, 20:31
quelle
6

Um Ihnen eine einfache Antwort zu geben, werden statische Klassen auf einem so genannten Loader Heap gespeichert. Loader-Heaps sind spezielle, nicht-GC-Heilungen, die extrem vorhersagbare und strenge Wachstumsraten haben. Wenn eine .NET-Anwendung gestartet wird, werden tatsächlich mehrere Anwendungsdomänen erstellt. Zusätzlich zur primären Anwendungsdomäne gibt es Systemdomänen und freigegebene Anwendungsdomänen, die die Systemnamespaces und mscorelib, spezielle Heaps (wie die Loader-Heaps) und die CLR selbst enthalten.

Lesen Sie den folgenden Artikel im MSDN Magazine, um eine ausführliche Erläuterung zu erhalten:

In .NET Framework-Interna bohren, um zu sehen, wie die CLR Laufzeitobjekte erstellt

>

Obwohl es von vor ein paar Jahren ist, gilt es immer noch. (Allerdings kann ich nicht sagen, ob sich .NET 4.0 so sehr geändert hat.)

    
jrista 25.08.2009 04:16
quelle

Tags und Links