7

Einige neuere Sprachen implementieren ARC in ihre Compiler (Swift und Rust, um ein paar zu nennen). Wie ich verstehe, erreicht dies das gleiche wie Laufzeit-GC (die Last der manuellen Freigabe aus dem Programmierer entfernt), während deutlich effizienter.Was ist der Vorteil von Runtime GC gegenüber ARC zur Kompilierungszeit?

Ich verstehe, dass ARC ein komplexer Prozess werden könnte, aber mit der Komplexität moderner Garbage Collectors scheint es, als wäre es nicht komplexer, ARC zu implementieren. Es gibt jedoch immer noch eine Vielzahl von Sprachen und Frameworks, die GC für die Speicherverwaltung verwenden, und sogar die Go-Sprache, die auf die Systemprogrammierung abzielt, verwendet GC.

Ich kann wirklich nicht verstehen, warum GC ARC vorzuziehen wäre. Fehle ich hier etwas?

Antwort

20

Es gibt eine Reihe von Kompromissen hier, es ist ein komplexes Thema. Hier ist die Großen aber:

GC Profis:

  • Müllsammler Tracing Zyklen in Objektgraphen verarbeiten kann. Die automatische Referenzzählung führt zu einem Speicherverlust, es sei denn, die Zyklen werden manuell unterbrochen, indem entweder eine Referenz entfernt wird oder ermittelt wird, welche Kante des Graphen schwach sein sollte. Dies ist ein ziemlich häufiges Problem in der Praxis in Bezug gezählten Apps.
  • Tracing Garbage Collectors können tatsächlich (gemessen am Durchsatz) mäßig schneller sein als Referenzzählung, indem sie gleichzeitig arbeiten, durch Batch-Verarbeitung, durch Verschieben von Arbeitsschritten und nicht durch Aufeinanderschlagen von Referenzwerten in Hot-Schleifen.
  • Kopieren Kollektoren den Heap komprimieren kann, Rückgewinnung von fragmentierten Seiten Fußabdruck Profis

ARC zu reduzieren:

  • Da geschieht sofort Objekt Zerstörung, wenn der Referenzzähler 0 trifft, kann Objektlebensdauern verwendet werden, um zu verwalten Nicht-Speicherressourcen. Bei der Speicherbereinigung sind Lebensdauern nicht deterministisch, daher ist dies nicht sicher.
  • Sammlung Arbeit ist in der Regel verteilt, in vielen kürzeren Pausen resultierend (es ist immer noch möglich, eine Pause zu bekommen, wenn Sie eine große Subgraphen von Objekten freigeben)
  • Da Speicher synchron gesammelt wird, ist es nicht möglich ist, den Kollektor zu „entkommen "Durch schnelleres Zuteilen als es aufräumen kann. Dies ist besonders wichtig, wenn VM-Paging zum Einsatz kommt, da es degenerierte Fälle gibt, in denen der GC-Thread auf eine Seite trifft, die ausgelagert wurde und weit zurückfällt.
  • Über einen entsprechenden Hinweis, Müllsammler Tracing haben das gesamte Objektgraphen zu gehen, die unnötige Seite-ins zwingt (für diese wie https://people.cs.umass.edu/~emery/pubs/f034-hertz.pdf es Milderungen sind, aber sie sind nicht weit verbreitet)
  • Tracing Müllsammler der Regel brauchen mehr „scratch space“ als Referenzzählung, wenn sie ihre volle Durchsatz

Meine persönliche Meinung dazu treffen ist, dass die nur zwei Punkte, die wirklich wichtig für die meisten Fälle sind:

  • ARC sammelt keine Zyklen
  • GC muss nicht deterministisch Lebensdauer

Ich glaube, dass diese beiden Fragen sind Dealbreaker, aber in Ermangelung einer besseren Idee, man muss nur wählen, welche erschreckendes Problem klingt schlimmer für dich.

+1

Für einen allgemeinen konzeptionellen Vergleich der Verfolgungs-GC vs Referenzzählung zeigt dieser Artikel, "Eine vereinheitlichte Theorie der Garbage Collection", wie sie als strikte Duale voneinander gesehen werden können. Verschiedene Optimierungen und Verbesserungen an jedem Ansatz bewegen Sie einfach entlang eines Spektrums, das sie verbindet: https://www.cs.virginia.edu/~cs415/reading/bacon-garbage.pdf – algal

+0

oh, yeah, ich liebe dieses Papier: D Danke für die Verknüpfung –