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
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:
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:
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.
Lesen Sie das Buch Garbage Collection: Algorithmen für die automatische dynamische Speicherverwaltung .
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.
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.
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:
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!
Tags und Links language-agnostic garbage-collection computer-science