Bei der Sammlung kopiert der Garbage Collector alle Live-Objekte in einen anderen Speicherplatz und verwirft damit alle Garbage-Objekte im Prozess. Ein Vorwärtszeiger auf das kopierte Objekt im neuen Bereich wird in die "alte" Version eines Objekts installiert, um sicherzustellen, dass der Kollektor alle verbleibenden Verweise auf das Objekt korrekt aktualisiert und das gleiche Objekt nicht fälschlicherweise zweimal kopiert.
Das funktioniert offensichtlich gut für Stop-the-World-Sammler. Da die Pausenzeiten bei stop-the-world jedoch lang sind, erlauben die meisten Garbage-Collectors heute, dass die Mutator-Threads gleichzeitig mit dem Collector ausgeführt werden. Die Mutatoren werden nur für kurze Zeit gestoppt, um den anfänglichen Stack-Scan durchzuführen.
Wie kann der Kollektor also sicherstellen, dass der Mutator während oder nach dem Kopieren nicht auf die "alte" Version eines Objekts zugreift? Ich stelle mir vor, die Mutatoren könnten mit einer Art Lesebarriere nach dem Vorwärtszeiger suchen, aber das erscheint mir zu teuer, da Variablen so oft gelesen werden.
Sie müssen ziemlich genau eine Lesebarriere oder eine Schreibsperre verwenden. Sie sind sich bereits der Lesebarriere bewusst, also werde ich nicht versuchen, in sie hineinzukommen.
Writer-Barrieren funktionieren, denn solange Sie Schreibvorgänge verhindern, ist es Ihnen egal, ob jemand auf die alte oder die neue Kopie der Daten zugreift. Sie legen die Schreibsperre fest, kopieren die Daten und beginnen dann mit der Zeigereinstellung. Nachdem die Kopie erstellt wurde, ist es Ihnen egal, ob jemand die alte oder die neue Kopie der Daten liest, da die Schreibsperre dafür sorgt, dass sie identisch sind. Sobald Sie mit der Anpassung der Zeiger fertig sind, wird alles mit den neuen Daten arbeiten, so dass Sie die Schreibbarriere aufheben.
Es wurde etwas Arbeit mit der Verwendung von Seitenschutzbits unternommen, um einen Speicherbereich als schreibgeschützt zu markieren, um eine Schreibbarriere auf ziemlich standardmäßiger Hardware zu erzeugen. Zumindest als ich mich das letzte Mal damit beschäftigt habe, war dies immer noch ein Konzept für die Proof - of - Concept - Arbeit, aber zu langsam, um sehr praktisch zu sein.
Die geladene Wertschranke , die in Azuls pausenlosem Garbage Collector für Generationen implementiert ist, ist ein Beispiel für eine Lösung dieses Problems. Sie können darüber im Artikel Der Azul Garbage Collector lesen, der Anfang 2011 auf InfoQ veröffentlicht wurde.
Tags und Links language-agnostic garbage-collection concurrency copying