Müllsammlung

8

Ich kann einige Dinge in der Garbage-Sammlung nicht verstehen.

Erstens, wie ist Daten Speicherplatz zugeordnet? d. h. auf Stapel oder Heap (meines Wissens ist allen statischen oder globalen Variablen Speicherplatz auf dem Stapel zugewiesen und lokalen Variablen wird Speicherplatz auf dem Heap zugewiesen).

Zweitens läuft GC auf Daten auf Stapeln oder Haufen? D. h., ein GC-Algorithmus wie Mark / Sweep würde sich auf Daten im Stapel als root set right beziehen? Und dann ordnen Sie alle erreichbaren Variablen auf dem Heap zu, indem Sie prüfen, welche Variablen auf dem Heap auf den Root-Satz verweisen.

Was ist, wenn ein Programm keine globale Variable hat? Wie funktioniert der Algorithmus dann?

Grüße, darkie

    
name_masked 28.02.2010, 03:43
quelle

6 Antworten

11

Es könnte helfen zu klären, auf welchem ​​Plattform-GC Sie sich befinden - JVM, CLR, Lisp, etc. Das sagte:

Als Erstes werden bestimmte lokale Variablen in der Regel auf dem Stack zugeordnet. Die Einzelheiten können jedoch von Sprache zu Sprache variieren. Um C # als Beispiel zu nehmen, werden nur lokale Wertetypen und Methodenparameter auf dem Stapel gespeichert. In C # würde also foo auf dem Stack zugewiesen:

%Vor%

Alternativ verwenden dynamisch zugewiesene Variablen Speicher aus dem Heap. Dies sollte intuitiv sinnvoll sein, da sonst der Stack bei jedem Aufruf von new dynamisch wachsen müsste. Es würde auch bedeuten, dass solche Variablen nur als Locals innerhalb der lokalen Funktion verwendet werden können, die sie zugewiesen hat, was natürlich nicht wahr ist, weil wir beispielsweise Klassenmitgliedsvariablen haben können. Um ein anderes Beispiel aus C # zu nehmen, wird im folgenden Fall result auf dem Heap zugewiesen:

%Vor%

In Anbetracht dieses Hintergrunds ist Speicher auf dem Heap ein Garbage-Collected. Speicher auf dem Stapel benötigt keine GC, da der Speicher zurückgewonnen wird, wenn die aktuelle Funktion zurückkehrt. Auf einer hohen Ebene arbeitet ein GC-Algorithmus, indem er alle Objekte verfolgt, die auf dem Heap dynamisch zugewiesen sind. Sobald es über new zugewiesen wurde, wird das Objekt von GC verfolgt und gesammelt, wenn es nicht mehr im Gültigkeitsbereich ist und es keine Referenzen mehr gibt.

    
Justin Ethier 28.02.2010, 03:47
quelle
2
  

Erstens, wie ist Daten Speicherplatz zugeordnet?   d. h. auf Stapel oder Haufen (nach meinem   Wissen, alles statisch oder global   Variablen werden Speicherplatz auf Stapel zugewiesen   und lokalen Variablen wird Speicherplatz zugewiesen   auf Haufen).

Nein, Stapelvariablen sind Methodenaufrufe und lokale Variablen. Ein Stack-Frame wird beim Aufruf der Methode erstellt und bei der Rückgabe wieder entfernt.

Speicher in Java und C # wird auf dem Heap durch Aufrufen von "new" zugewiesen.

  

Zweitens läuft GC auf Daten auf Stapeln oder   Haufen? ein GC-Algorithmus wie   Mark / Sweep würde sich auf Daten beziehen   Stack als root richtig gesetzt? Und dann map   alle erreichbaren Variablen auf dem Heap von   Überprüfen, welche Variablen auf Heap verweisen   an den Stammsatz.

GC wird auf dem Heap verwendet.

Mark and sweep würde nicht als bahnbrechender GC-Algorithmus betrachtet werden. Sowohl Java als auch .NET GC verwenden jetzt Generationsmodelle.

  

Was ist, wenn ein Programm keine a hat?   Globale Variable? Wie funktioniert das?   Algorithmus funktioniert dann?

Was bedeutet "globale Variable" in Sprachen wie Java und C #, wo alles zu einer Klasse gehört?

Die Wurzel des Objektgraphen ist beliebig. Ich gebe zu, dass ich nicht weiß, wie es gewählt wurde.

    
duffymo 28.02.2010 03:50
quelle
1

Lesen Sie diesen Artikel . Es ist eine sehr gute Übersicht über Einprozessor-Speicherbereinigungstechniken. Es vermittelt Ihnen das grundlegende Verständnis und die Terminologie von GC. Dann folgen Sie dem Buch "Garbage Collection: Algorithms for Automatic Dynamic Memory Management" von Jones and Lins. Im Gegensatz zu dem Artikel, auf den ich oben hingewiesen habe, ist das Buch nicht kostenlos im Internet verfügbar. du musst es kaufen; aber es ist es wert.

    
Thomas Pornin 01.03.2010 16:16
quelle
1

Richard und Carl haben eine sehr schöne Show auf dem Windows Memory Model, einschließlich des .NET-Modells und GC, in ihrem .NET Felsen! Archive:

Jeffrey Richter im Windows Memory Model

    
Rune 01.03.2010 16:28
quelle
0

Sie finden möglicherweise die kurze Zusammenfassung von Garbage Collection in der Referenz zur Speicherverwaltung

Letztendlich muss die Speicherbereinigung bei den Registern der Prozessoren beginnen, da alle Objekte, die vom Prozessor nicht erreicht werden können, wiederverwendet werden können. Abhängig vom Sprach- und Laufzeitsystem ist es sinnvoll, statisch davon auszugehen, dass auch die Stacks und Register von Threads erreichbar sind, sowie "globale Variablen".

Stacks erhalten wahrscheinlich lokale Variablen. In einfachen GCs beginnen Sie also mit dem Scannen von Thread-Kontexten, ihren Stapeln und den globalen Variablen. Aber das stimmt sicherlich nicht in jedem Fall. Einige Sprachen verwenden keine Stapel oder haben globale Variablen als solche. Darüber hinaus können GCs eine Barriere verwenden, damit sie nicht jeden Stapel einsehen müssen oder global jedes Mal. Einige spezialisierte Hardware, wie die Symbolik Lisp Machine , hatten Barrieren in den Registern!

    
rptb1 14.07.2011 19:19
quelle