Ja, GC wird zu konstanten Zeiten abgeschrieben. Angenommen, Sie haben einen Algorithmus, der für die Zeit mit einer Spitzenarbeitsmenge der Größe k ausgeführt wird . Beachten Sie nun, dass Sie während der Ausführung des Programms höchstens O ( n ) Wörter zuweisen können und dass die Zeitkosten für das Ausführen eines Kopier-Garbage-Collectors O ( k ) betragen (dh die Kosten für ein gc sind proportional zur Gesamtsumme) Menge der Live-Daten). Wenn Sie also gc höchstens O ( n / k ) Mal ausführen , sind die Gesamtlaufzeitkosten durch O ( n ) begrenzt.nkO ( n )O ( k )O ( n / k )O ( n )Dies bedeutet, dass die fortgeführten Anschaffungskosten des GC konstant sind. Wenn Sie also einen Cheney-ähnlichen Sammler haben, bei dem jeder Halbraum groß ist , ist es leicht zu erkennen, dass eine vollständige Sammlung nicht mehr als einmal alle n / k Schritte aufgerufen werden kann, da die Zuweisung von k Wörtern O ( k ) erfordert. Zeit, und die Arbeitsmenge überschreitet nie die Größe k , wodurch Sie die gewünschte Grenze erhalten. Dies rechtfertigt das Ignorieren von GC-Problemen.2 kn / kkO ( k )k
Ein Fall, in dem das Vorhandensein oder Nichtvorhandensein von gc nicht ignoriert werden kann, ist das Schreiben von sperrfreien Datenstrukturen. Viele moderne schlossfreie Datenstrukturen schlossfreie lecken absichtlich den Speicher und verlassen sich auf die Richtigkeit von gc. Dies liegt daran, dass auf einer hohen Ebene die Art und Weise, wie sie arbeiten, darin besteht, einige Daten zu kopieren, Änderungen daran vorzunehmen und zu versuchen, sie mit einem CAS-Befehl atomar zu aktualisieren und dies in einer Schleife auszuführen, bis der CAS erfolgreich ist. Das Hinzufügen einer deterministischen Freigabe zu diesen Algorithmen macht sie viel komplexer, und die Benutzer stören sich oft nicht daran (zumal sie häufig auf Java-ähnliche Umgebungen abzielen).
BEARBEITEN: Wenn Sie nicht abgeschriebene Grenzen möchten, wird dies vom Cheney-Sammler nicht ausgeführt. Bei jedem Aufruf wird das gesamte Live-Set gescannt. Das Schlüsselwort für Google ist "Garbage Collection in Echtzeit", und Djikstra et al. und Steele gab die ersten Echtzeit-Mark-and-Sweep-Sammler, und Baker gab die ersten Echtzeit-Verdichtungs-GC.
@article {dijkstra1978fly,
title = {{On-the-fly Müllabfuhr: Eine Übung in Zusammenarbeit}},
author = {Dijkstra, EW und Lamport, L. und Martin, AJ und Scholten, CS und Steffens, EFM},
journal = {Mitteilungen der ACM},
volume = {21},
number = {11},
pages = {966--975},
issn = {0001-0782},
Jahr = {1978},
publisher = {ACM}
}
@article {steele1975multiprocessing,
title = {{Multiprocessing-Speicherbereinigung}},
author = {Steele Jr, GL},
journal = {Mitteilungen der ACM},
volume = {18},
number = {9},
pages = {495--508},
issn = {0001-0782},
Jahr = {1975},
publisher = {ACM}
}
@article {baker1978list,
title = {{Listenverarbeitung in Echtzeit auf einem seriellen Computer}},
author = {Baker Jr, HG},
journal = {Mitteilungen der ACM},
volume = {21},
number = {4},
pages = {280--294},
issn = {0001-0782},
Jahr = {1978},
publisher = {ACM}
}