Behält der Garbage Collector ein Array bei, auf das nur von rohen Zeigern verwiesen wird?

8

Ich möchte ein Array von Elementen aus dem Garbage-Collected-Heap zuweisen und auf diese Elemente nur über rohe Zeiger zugreifen. Kann der Garbage Collector diesen Speicherblock zurückgewinnen, nachdem (und nicht vorher) alle Zeiger, die auf ihn zeigen, den Gültigkeitsbereich verlassen haben?

Ich dachte daran, es so zu machen:

%Vor%     
TommiT 30.08.2012, 08:19
quelle

1 Antwort

14

Ihr Szenario wird funktionieren.

Zwei Dinge:

  1. Der Müllsammler ist konservativ. Das bedeutet, dass es die rohen Wörter des Stapels, der Register und des GC-Heaps scannt. Alles, was wie ein Zeiger auf vom GC zugewiesenen Speicher aussieht, wird als solcher betrachtet und behält daher dieses Speicherelement im Speicher.
  2. Der Garbage Collector erlaubt innere Zeiger. Der Grund dafür ist zweifach. Erstens ist es ziemlich üblich (in einer Systemsprache), den rohen Speicher nur mit Zeigerarithmetik zu durchlaufen, so dass der GC eine Situation wie diese behandeln muss, bei der nur ein Offsetzeiger auf den GC-Speicher zeigt. Zweitens sind Interfaces in D eigentlich nur Offsets vom Basisobjekt, also müssen diese das Originalobjekt live halten.

Es ist erwähnenswert, dass innere Zeiger die Markierungsphase des Garbage Collectors erheblich verlangsamen, aber in einer Systemsprache wie D wäre es nicht sinnvoll, interne Zeiger nicht zu unterstützen.

Beachten Sie schließlich, dass wenn Sie einen Zeiger auf GC-allokierten Speicher außerhalb des GC-Heaps und des Stacks / Registers speichern, nicht vom GC erkannt wird. Das heißt, wenn Sie das .ptr eines Arrays in einem% code speichern und dann alle Referenzen wegwerfen, wird es beispielsweise nicht als live betrachtet.

    
user438034 30.08.2012, 08:23
quelle