In einem sich bewegenden Garbage Collector muss unbedingt genau unterschieden werden, welche Werte auf dem Stapel und dem Heap Referenzen sind und welche unmittelbaren Werte sind. Dies ist ein Detail, das in der meisten Literatur, die ich über die Garbage Collection gelesen habe, beschönigt zu sein scheint.Wie befinden sich Speicherreferenzen in einer Implementierung von beweglicher Speicherbereinigung?
Ich habe untersucht, ob das Zuweisen einer Präambel zu jedem Stapelrahmen funktionieren würde, zum Beispiel das Beschreiben jedes Arguments, bevor es aufgerufen wird. Aber das alles bringt das Problem auf eine höhere Ebene der indirekten Ebene. Wie unterscheidet man dann die Präambel von dem Stapelrahmen, wenn sie während eines GC-Zyklus für unmittelbare Werte oder Referenzen durchlaufen wird?
Kann jemand erklären, wie dies in der realen Welt umgesetzt wird? Hier
ist ein Beispielprogramm für dieses Problem eine erstklassige Funktion lexikalische Verschluss mit und ein Diagramm der Stapelrahmen und und Eltern-Umgebung befindet sich auf dem Heap:
Ein Beispielprogramm
def foo(x) = {
def bar(y,z) = {
return x + y + z
}
return bar
}
def main() = {
let makeBar = foo(1)
makeBar(2,3)
}
Bar des Stapelrahmen am Punkt des Aufrufs:
In diesem Beispiel hat der Stack-Rahmen von bar eine lokale Variable, x, die einen Zeiger auf einen Wert auf dem Heap darstellt, wobei die Argumente y und z unmittelbare Ganzzahlwerte sind.
Ich lese, dass Objective CAML verwendet ein Tag-Bit für jeden Wert auf dem Stapel platziert, die jedem Wert vorangestellt. Zulassen einer binären ref-or-imm-Prüfung für jeden Wert während eines GC-Zyklus. Dies kann jedoch unerwünschte Nebenwirkungen haben. Ganzzahlen sind auf 31 Bit beschränkt und die dynamische Codegenerierung für Grundelementberechnungen müsste angepasst werden, um dies zu kompensieren. Kurz gesagt - es fühlt sich ein wenig zu dreckig an. Es muss eine elegantere Lösung geben.
Ist es möglich, diese Informationen statisch zu kennen und darauf zuzugreifen? Wie etwa die Typinformation irgendwie an den Garbage Collector zu übergeben?
Als interessante Studie, sehen Sie die Entwicklung des Garbage Collectors im 'Mono' Framework. – Jester
Danke, ich werde das untersuchen. – Jake
Der Stop-and-Copy-Speicherbereinigungsalgorithmus ist nur eine Art der Verfolgungsspeicherbereinigungsmethode, die alle ermitteln, ob ein Objekt aktiv ist, indem Verweise darauf zurückverfolgt werden, um bestimmte Stammobjekte wiederherzustellen. Wie diese Wurzelobjekte ermittelt werden, ist nicht Teil des Garbage Collection-Algorithmus selbst. Es gibt viele Möglichkeiten, wie ein Wert auf dem Stack als Root ermittelt werden kann. Eine Implementierung kann annehmen, dass jeder Wert ein Verweis auf ein Objekt ist. Oder es könnte annehmen, dass es überhaupt keine gibt, entweder indem sie keine Objekte auf dem Stapel haben oder erfordern, dass sie woanders verwurzelt sind. –