Dies scheint eine einfache Frage zu sein, aber nachdem ich viel über das Thema gelesen habe, habe ich immer noch keine endgültige Antwort gefunden (vielleicht, weil es so einfach ist).
Meine Frage lautet: Wenn ein Garbage Collector Objekte im Heap komprimiert, wie werden die Verweise auf diese Objekte im Stack aktualisiert? Ich kann mir zwei mögliche Lösungen vorstellen:
- Durchsuchen Sie den Stapel (und die Verweise im Heap) und aktualisieren Sie den Verweis, um auf die neue Position des Objekts zu verweisen. In Analogie zum Umzug würde dies bedeuten, dass Sie jedem, der Ihre Adresse hat, einen Brief senden und ihn bitten, sein Adressbuch mit Ihrer neuen Adresse zu aktualisieren.
- Stellen Sie eine Art Nachschlagetabelle zur Verfügung. Das wäre so, als würde man eine Weiterleitungsadresse bei der örtlichen Post hinterlassen.
Wenden Müllsammler überwiegend eine dieser beiden Methoden an? Eine andere Methode? Beide?
garbage-collection
todorojo
quelle
quelle
Antworten:
Ich habe diesbezüglich keine speziellen Kenntnisse, aber ich verstehe, dass die erste Methode im Allgemeinen angewendet wird.
Der Müllsammler muss den Stapel trotzdem analysieren, um herauszufinden, auf welche Dinge im Heap vom Stapel verwiesen wird. Sobald es sich dazu entschließt, etwas zu verschieben, muss es dennoch die Verweise darauf korrigieren, und es gibt keinen Grund, an diesem Punkt zwischen Heap und Stack zu unterscheiden.
Der Lookup-Table-Ansatz könnte prinzipiell funktionieren. Dies würde jedoch dazu führen, dass alle Zeigerzugriffe 2 Schritte benötigen. Dies würde die Leistung erheblich beeinträchtigen und die normalen Laufzeiten beeinträchtigen. Besonders für den Anwendungsfall vieler kleiner Objekte. (Dies ist ein Fall, in dem GC-Programme auf dem neuesten Stand der Technik in der Regel die Referenzzählung übertreffen.)
quelle