Müll-Sammlung (Informatik)

In der Informatik ist Müll-Sammlung (GC) eine Form des automatischen Speichermanagements. Der Müllmann, oder gerade Sammler, versuchen, Müll oder Gedächtnis zurückzufordern, das durch Gegenstände besetzt ist, die nicht mehr im Gebrauch durch das Programm sind. Müll-Sammlung wurde von John McCarthy 1959 erfunden, um Probleme im Lispeln zu beheben.

Müll-Sammlung wird häufig als das Gegenteil des manuellen Speichermanagements porträtiert, das verlangt, dass der Programmierer angibt, welche Gegenstände zu deallocate und ins Speichersystem zurückgeben. Jedoch verwenden viele Systeme eine Kombination von Annäherungen, einschließlich anderer Techniken wie Stapel-Zuteilung und Gebiet-Schlussfolgerung.

Müll-Sammlung führt beschränkte Mittel außer dem Gedächtnis nicht traditionell, das typische Programme, wie Netzsteckdosen, Datenbankgriffe, Benutzerwechselwirkungsfenster, und Datei und Gerät-Deskriptoren verwenden. Methoden, die verwendet sind, um solche Mittel, besonders destructors zu führen, können ebenso genügen, um Gedächtnis zu führen, kein Bedürfnis nach GC verlassend. Einige GC Systeme erlauben solchen anderen Mitteln, mit einem Gebiet des Gedächtnisses vereinigt zu werden, das, wenn gesammelt, die andere Quelle veranlasst, zurückgefordert zu werden; das wird Fertigstellung genannt. Fertigstellung kann Komplikationen einführen, die seine Brauchbarkeit wie untragbare Latenz zwischen dem Nichtgebrauch beschränken, und besonders beschränkter Mittel oder eines Mangels an der Kontrolle protestieren, über die Faden die Arbeit des Zurückforderns durchführt.

Grundsätze

Die Kernprinzipien der Müll-Sammlung sind:

  1. Finden Sie Datengegenstände in einem Programm, auf das in der Zukunft nicht zugegriffen werden kann
  2. Fordern Sie die Mittel zurück, die durch jene Gegenstände verwendet sind

Viele Computersprachen verlangen Müll-Sammlung, irgendein als ein Teil der Sprachspezifizierung (z.B, Java, C#, und die meisten scripting Sprachen) oder effektiv für die praktische Durchführung (z.B, formelle Sprachen wie Lambda-Rechnung); wie man sagt, sind das gesammelte Sprachen des Mülls. Andere Sprachen wurden für den Gebrauch mit dem manuellen Speichermanagement entworfen, aber haben gesammelte Durchführungen des Mülls verfügbar (z.B, C, C ++). Einige Sprachen, wie Ada, Modula-3 und C ++/CLI erlauben sowohl Müll-Sammlung als auch manuellem Speichermanagement, in derselben Anwendung durch das Verwenden getrennter Haufen für gesammelte und manuell geführte Gegenstände zu koexistieren; andere, wie D, sind Müll gesammelt, aber erlauben dem Benutzer, Gegenstände manuell zu löschen und auch völlig Müll-Sammlung unbrauchbar zu machen, wenn Geschwindigkeit erforderlich ist. Während die Integrierung der Müll-Sammlung in den Bearbeiter der Sprache und Laufzeitsystem eine viel breitere Wahl von Methoden ermöglicht, Posten hoc GC Systeme, bestehen einschließlich einiger, die Wiederkompilation nicht verlangen. (Post-hoc ist GC manchmal als Sänfte-Sammlung bemerkenswert.) Der Müllmann wird fast immer mit dem Speicherverteiler nah integriert.

Vorteile

Müll-Sammlung befreit den Programmierer davon, manuell sich mit Gedächtnis deallocation zu befassen. Infolgedessen werden bestimmte Kategorien von Programmfehlern beseitigt oder wesentlich reduziert:

  • Baumelnde Zeigestock-Programmfehler, die vorkommen, wenn ein Stück des Gedächtnisses befreit wird, während es noch Zeigestöcke dazu und einen jener Zeigestöcke gibt, sind dereferenced. Bis dahin kann das Gedächtnis einem anderen Gebrauch mit unvorhersehbaren Ergebnissen wiederzugeteilt worden sein.
  • Verdoppeln Sie freie Programmfehler, die vorkommen, wenn das Programm versucht, ein Gebiet des Gedächtnisses zu befreien, das bereits befreit, und vielleicht bereits wieder zugeteilt worden worden ist.
  • Bestimmte Arten von Speicherleckstellen, in denen ein Programm scheitert, Gedächtnis zu befreien, das durch Gegenstände besetzt ist, die wirklich unerreichbar geworden sind, der zu Speichererschöpfung führt, wenn solch ein Verhalten unbestimmt wiederholt wird. (Müll-Sammlung befasst sich normalerweise mit der unbegrenzten Anhäufung von Daten nicht, die erreichbar ist, aber die wirklich durch das Programm nicht verwendet wird.)

Einige der durch die Müll-Sammlung angeredeten Programmfehler können Sicherheitsimplikationen haben.

Nachteile

Gewöhnlich hat Müll-Sammlung bestimmte Nachteile:

  • Müll-Sammlung verbraucht Rechenmittel im Entscheiden, welches Gedächtnis zu freien, wieder aufbauenden Tatsachen, die dem Programmierer bekannt gewesen sein können. Die Strafe für die Bequemlichkeit des nicht Kommentierens der Gegenstand-Lebenszeit manuell im Quellcode führt oben häufig zu verminderter oder unebener Leistung. Die Wechselwirkung mit Speicherhierarchie-Effekten kann das oben untragbar in Verhältnissen machen, die hart sind, vorauszusagen oder in der alltäglichen Prüfung zu entdecken.
  • Der Moment, wenn der Müll wirklich gesammelt wird, kann unvorhersehbar sein, auf überall in einer Sitzung gestreute Marktbuden hinauslaufend. Unvorhersehbare Marktbuden können in Realtime Umgebungen, in der Transaktionsverarbeitung, oder in interaktiven Programmen unannehmbar sein.
  • Nichtdeterministischer GC ist mit dem gestützten Management von RAII nicht GCed Mittel unvereinbar. Infolgedessen wird das Bedürfnis nach dem ausführlichen manuellen Quellenmanagement (Ausgabe/Ende) für non-GCed Mittel transitiv für die Zusammensetzung. Das ist: In einem nichtdeterministischen GC System, wenn eine Quelle oder eine Quelle wie Gegenstand manuelles Quellenmanagement (Ausgabe/Ende) verlangen, und wird dieser Gegenstand als 'Teil eines ' anderen Gegenstands verwendet, dann wird der gelassene Gegenstand auch eine Quelle werden mögen Gegenstand, der selbst manuelles Quellenmanagement (Ausgabe/Ende) verlangt.

Nachforschung von Müllmännern

Verfolgende Müllmänner sind der allgemeinste Typ des Müllmannes. Sie bestimmen zuerst, welche Gegenstände erreichbar (oder potenziell erreichbar sind), und dann verwerfen Sie alle restlichen Gegenstände.

Reachability eines Gegenstands

Informell ist ein Gegenstand erreichbar, wenn darin durch mindestens eine Variable im Programm entweder direkt oder durch Verweisungen von anderen erreichbaren Gegenständen Verweise angebracht wird. Genauer können Gegenstände auf nur zwei Weisen erreichbar sein:

Wie man
  1. annimmt, ist ein ausgezeichneter Satz von Gegenständen erreichbar: Diese sind als die Wurzeln bekannt. Gewöhnlich schließen diese alle Gegenstände Verweise angebracht von überall her im Anruf-Stapel (d. h. alle lokalen Variablen und Rahmen in den Funktionen ein zurzeit angerufen) und irgendwelche globalen Variablen.
  2. Irgendetwas Verweise Angebrachtes von einem erreichbaren Gegenstand ist selbst erreichbar; mehr formell ist reachability ein transitiver Verschluss.

Die reachability Definition "des Mülls" ist nicht optimal, insofern als das letzte Mal, wenn ein Programm einen Gegenstand verwendet, lange vor diesem Gegenstand Fälle aus dem Umgebungsspielraum sein konnte. Ein Unterschied wird manchmal zwischen dem syntaktischen Müll, jene Gegenstände gemacht, die das Programm, und semantischer Müll, jene Gegenstände nicht vielleicht erreichen kann, die das Programm tatsächlich nie wieder verwenden wird. Zum Beispiel:

Wenden Sie x = neuer Foo ein;

Wenden Sie y = neue Bar ein;

x = neuer Quux ;

/* an diesem Punkt wissen wir, dass der Foo einwendet

* ursprünglich zugeteilt x wird nie sein

* hat zugegriffen: Es ist syntaktischer Müll

*/

wenn (x.check_something ) {\

x.do_something (y);

}\

System.exit (0);

/* im obengenannten Block, y *could*, semantischer Müll, sein

*, aber werden wir nicht wissen, bis x.check_something zurückgibt

* ein Wert: Wenn es am ganzen zurückkehrt

*/

</Quelle>

Das Problem, genau semantischen Abfalleimer zu identifizieren, leicht gezeigt werden, teilweise entscheidbar zu sein: Ein Programm, das einen Gegenstand X zuteilt, führt ein willkürliches Eingangsprogramm P, und verwendet X, wenn, und nur wenn P-Schlüsse verlangen würden, dass ein semantischer Müllmann das stockende Problem behebt. Obwohl konservative heuristische Methoden für die semantische Müll-Entdeckung ein aktives Forschungsgebiet bleiben, im Wesentlichen konzentrieren sich alle praktischen Müllmänner auf syntaktischen Müll.

Eine andere Komplikation mit dieser Annäherung besteht darin, dass, auf Sprachen sowohl mit Bezugstypen als auch mit in Schachteln ungepackten Werttypen, der Müllmann irgendwie im Stande sein muss zu unterscheiden, welche Variablen auf dem Stapel oder den Feldern in einem Gegenstand regelmäßige Werte sind, und die Verweisungen sind: Im Gedächtnis könnten eine ganze Zahl und eine Verweisung ähnlich aussehen. Der Müllmann muss dann wissen, ob man das Element als eine Verweisung behandelt und ihm folgt, oder ob es ein primitiver Wert ist. Eine allgemeine Lösung ist der Gebrauch von markierten Zeigestöcken.

Starke und Schwache Verweisungen

Der Müllmann kann nur Gegenstände zurückfordern, die keine Verweisungen haben. Jedoch, dort kann zusätzliche Verweisungen bestehen, die gewissermaßen nicht von Bedeutung sind, die schwache Verweisungen genannt werden. In Diskussionen über schwache Verweisungen werden gewöhnliche Verweisungen manchmal starke Verweisungen genannt. Ein Gegenstand ist für die Müll-Sammlung berechtigt, wenn dort nicht stark (d. h. gewöhnlich sind) Verweisungen darauf, wenn auch es noch einige schwache Verweisungen darauf geben könnte.

Eine schwache Verweisung ist nicht bloß gerade jeder Zeigestock zum Gegenstand, über den sich ein Müllmann nicht sorgt. Der Begriff wird gewöhnlich für eine richtig geführte Kategorie von speziellen Bezugsgegenständen vorbestellt, die sicher sind zu verwenden, selbst wenn der Gegenstand verschwindet, weil sie zu einem sicheren Wert verstreichen. Eine unsichere Verweisung, die dem Müllmann nicht bekannt ist, wird einfach baumeln müssen, indem sie fortgesetzt wird, sich auf die Adresse zu beziehen, wo der Gegenstand vorher gewohnt hat. Das ist nicht eine schwache Verweisung.

In einigen Durchführungen, namentlich in Microsoft.NET, werden die schwachen Verweisungen in zwei weitere Unterkategorien geteilt: Lange schwache Verweisungen (verfolgt Wiederaufleben), und kurze schwache Verweisungen.

Schwache Sammlungen

Gegenstände, die Sammlungen anderer Gegenstände aufrechterhalten, können auch ausgedacht werden, die schwache Verfolgen-Eigenschaften haben. Zum Beispiel sind schwache Hash-Tabellen nützlich. Wie eine regelmäßige Hash-Tabelle unterstützt eine schwache Hash-Tabelle eine Vereinigung zwischen Paaren von Gegenständen, wo, wie man versteht, jedes Paar ein Schlüssel und Wert ist. Jedoch erhält die Hash-Tabelle keine starke Verweisung auf diesen Gegenständen wirklich aufrecht. Ein spezielles Verhalten findet statt, wenn entweder der Schlüssel oder Wert oder beider Müll werden: Der Hash-Tabelle-Zugang wird spontan gelöscht. Dort bestehen Sie weitere Verbesserungen wie Hash-Tabellen, die nur schwache Schlüssel haben (Wertverweisungen sind gewöhnliche, starke Verweisungen), oder nur schwache Werte (sind Schlüsselverweisungen stark).

Schwache Hash-Tabellen sind wichtig, für Vereinigungen zwischen Gegenständen, solch zu unterstützen, dass die mit der Vereinigung beschäftigten Gegenstände noch Müll werden können, wenn sich nichts im Programm auf sie länger (anders bezieht als die verkehrende Hash-Tabelle).

Der Gebrauch einer regelmäßigen Hash-Tabelle zu solch einem Zweck konnte zu einer "logischen Speicherleckstelle" führen: Die Anhäufung von erreichbaren Daten, die das Programm nicht braucht und nicht verwenden wird.

Grundlegender Algorithmus

Verfolgende Sammler sind so genannt, weil sie durch den Arbeitssatz des Gedächtnisses verfolgen. Diese Müllmänner führen Sammlung in Zyklen durch. Ein Zyklus wird angefangen, wenn der Sammler entscheidet (oder bekannt gegeben wird), dass er Gedächtnis zurückfordern muss, das meistenteils geschieht, wenn das System auf dem Gedächtnis niedrig ist. Die ursprüngliche Methode schließt ein naives Zeichen-Und-Kehren ein, in dem der komplette Speichersatz mehrere Male berührt wird.

Naives Zeichen-Und-Kehren

In der naiven Methode des Zeichens-Und-Kehrens hat jeder Gegenstand im Gedächtnis eine Fahne (normalerweise ein einzelnes Bit) vorbestellt für die Müll-Sammlung verwenden nur. Diese Fahne wird immer geklärt, außer während des Sammlungszyklus. Die erste Stufe der Sammlung tut ein Baumtraversal des kompletten 'Wurzelsatzes', jeden Gegenstand kennzeichnend, der auf als 'im Gebrauch' seiend angespitzt wird. Alle Gegenstände, die jene Gegenstände auf und so weiter anspitzen, werden ebenso gekennzeichnet, so dass jeder Gegenstand, der auf vom Wurzelsatz schließlich angespitzt wird, gekennzeichnet wird. Schließlich wird das ganze Gedächtnis von Anfang bis Ende gescannt, alle freien oder verwendeten Blöcke untersuchend; diejenigen mit der noch geklärten Fahne im Gebrauch sind durch jedes Programm oder Daten nicht erreichbar, und ihr Gedächtnis wird befreit. (Für Gegenstände, die im Gebrauch gekennzeichnet werden, wird die Fahne im Gebrauch wieder geklärt, sich auf den folgenden Zyklus vorbereitend.)

Diese Methode hat mehrere Nachteile, das bemerkenswerteste Wesen, dass das komplette System während der Sammlung aufgehoben werden muss; keiner Veränderung des Arbeitssatzes kann erlaubt werden. Das wird Programme veranlassen, regelmäßig (und allgemein unvorhersehbar) 'zu frieren', schritthaltende und zeitkritische Anwendungen unmöglich machend. Außerdem muss das komplette Arbeitsgedächtnis, viel davon zweimal untersucht werden, potenziell Probleme in paginierten Speichersystemen verursachend.

Trikolore-Markierung

Wegen dieser Fallen führen modernste Nachforschungsmüllmänner eine Variante der Trikolore-Markierungsabstraktion durch, aber einfache Sammler (wie der Sammler des Zeichens-Und-Kehrens) machen häufig diese Abstraktion ausführlich nicht.

Trikolore-Markierung arbeitet wie folgt:

  1. Schaffen Sie anfängliche weiße, graue und schwarze Sätze; diese Sätze werden verwendet, um Fortschritt während des Zyklus aufrechtzuerhalten.
  2. * Am Anfang sind der weiße Satz oder verurteilte Satz der Satz von Gegenständen, die Kandidaten dafür sind, ihr Gedächtnis wiederzuverwenden.
  3. * ist Der schwarze Satz der Satz von Gegenständen, die preiswert, wie man beweisen kann, keine Verweisungen auf Gegenstände im weißen Satz haben; in vielen Durchführungen fängt der schwarze Satz leer an.
  4. * ist Der graue Satz alle Gegenstände, die von Wurzelverweisungen erreichbar sind, aber die durch graue Gegenstände Verweise angebrachten Gegenstände sind noch nicht gescannt worden. Wie man bekannt, sind graue Gegenstände von der Wurzel erreichbar, so kann nicht gesammelter Müll sein: Graue Gegenstände werden schließlich im schwarzen Satz enden. Der graue Staat bedeutet, dass wir noch irgendwelche Gegenstände dass die Gegenstand-Verweisungen überprüfen müssen.
  5. * wird Der graue Satz zu Gegenständen initialisiert, in denen direkt am Wurzelniveau Verweise angebracht wird; normalerweise werden alle anderen Gegenstände in den weißen Satz am Anfang gelegt.
  6. * können sich Gegenstände von weiß bis grau zu schwarz nie in der anderen Richtung bewegen.
  7. Picken Sie einen Gegenstand vom grauen Satz auf. Werden Sie schwarz dieser Gegenstand (bewegen Sie es zum schwarzen Satz), durch greying alle weißen Gegenstände, in denen es direkt Verweise anbringt. Das bestätigt, dass dieser Gegenstand Müll gesammelt, und auch nicht sein kann, dass irgendwelche Gegenstände, in denen es Verweise anbringt, gesammelter Müll nicht sein können.
  8. Wiederholen Sie den vorherigen Schritt, bis der graue Satz leer ist.
  9. Wenn es keine Gegenstände mehr im grauen Satz gibt, dann sind alle Gegenstände, die im weißen Satz bleiben, demonstriert worden, um nicht erreichbar zu sein, und die von ihnen besetzte Lagerung kann zurückgefordert werden.

Das 3 Satz-Teilungsgedächtnis; jeder Gegenstand im System, einschließlich der gesetzten Wurzel, ist in genau einem Satz.

Die Trikolore, die Algorithmus kennzeichnet, bewahrt einen wichtigen invariant:

:No schwarzer Gegenstand weist direkt zu einem weißen Gegenstand hin.

Das stellt sicher, dass die weißen Gegenstände sicher zerstört werden können, sobald der graue Satz leer ist. (Einige Schwankungen auf dem Algorithmus bewahren die Trikolore invariant nicht, aber sie verwenden eine modifizierte Form, für die alle wichtigen Eigenschaften halten.)

Die Trikolore-Methode hat einen wichtigen Vorteil: Es kann 'während der Übertragung' durchgeführt werden, ohne das System seit bedeutenden Zeitabschnitten zu halten. Das wird durch die Markierung von Gegenständen vollbracht, weil sie zugeteilt werden und während der Veränderung, die verschiedenen Sätze aufrechterhaltend. Durch die Überwachung der Größe der Sätze kann das System Müll-Sammlung regelmäßig, aber nicht als - erforderlich durchführen. Außerdem ist das Bedürfnis, das komplette Arbeiten zu berühren, untergegangen jeder Zyklus wird vermieden.

Durchführungsstrategien

Um den grundlegenden Trikolore-Algorithmus durchzuführen, müssen mehrere wichtige Designentscheidungen getroffen werden, der die Leistungseigenschaften des Müllmannes bedeutsam betreffen kann.

Das Bewegen gegen das Nichtbewegen

Sobald der unerreichbare Satz bestimmt worden ist, kann der Müllmann einfach die unerreichbaren Gegenstände veröffentlichen und etwas anderes verlassen, wie es ist, oder es einige oder alle erreichbaren Gegenstände in ein neues Gebiet des Gedächtnisses kopieren kann, alle Verweisungen auf jene Gegenstände, wie erforderlich, aktualisierend. Diese werden genannt, "sich nichtbewegend" und "sich bewegend" (oder wechselweise "nichtzusammenpressend" und "zusammenpressend"), Müllmänner beziehungsweise.

Zuerst würde ein Bewegen GC Strategie kann ineffizient und kostspielig im Vergleich zur nichtbewegenden Annäherung seit viel mehr Arbeit scheinen, scheinen, auf jedem Zyklus erforderlich zu sein. Tatsächlich, jedoch, das Bewegen führt GC Strategie zu mehreren Leistungsvorteilen sowohl während des Müll-Sammlungszyklus selbst als auch während der wirklichen Programm-Ausführung:

  • Keine zusätzliche Arbeit ist erforderlich, den durch tote Gegenstände befreiten Raum zurückzufordern; das komplette Gebiet des Gedächtnisses, von dem erreichbare Gegenstände bewegt wurden, kann als freier Raum betrachtet werden. Im Gegensatz hat ein Nichtbewegen GC muss jeden unerreichbaren Gegenstand besuchen und irgendwie das das Gedächtnis es allein registrieren, besetzt ist verfügbar.
  • Ähnlich können neue Gegenstände sehr schnell zugeteilt werden. Da große aneinander grenzende Gebiete des Gedächtnisses gewöhnlich durch das Bewegen GC Strategie bereitgestellt werden, können neue Gegenstände durch das einfache Erhöhen eines 'freien Gedächtnisses' Zeigestock zugeteilt werden. Eine nichtbewegende Strategie, nach einer Zeit, kann zu einem schwer gebrochenen Haufen führen, teure Beratung "freier Listen" von kleinen verfügbaren Blöcken des Gedächtnisses verlangend, um neue Gegenstände zuzuteilen.
  • Wenn eine passende überquerende Ordnung verwendet wird (solcher als cdr-zuerst für die Liste conses), können Gegenstände, die sich auf einander oft beziehen, sehr in der Nähe von einander im Gedächtnis bewegt werden, die Wahrscheinlichkeit vergrößernd, dass sie in derselben Linie des geheimen Lagers oder virtueller Speicherseite gelegen werden. Das kann Zugang zu diesen Gegenständen durch diese Verweisungen bedeutsam beschleunigen.

Ein Nachteil eines bewegenden Müllmannes ist, dass es nur Zugang durch Verweisungen erlaubt, die durch den Müll geführt werden, hat Umgebung gesammelt, und erlaubt Zeigestock-Arithmetik nicht. Das ist, weil irgendwelche heimischen Zeigestöcke zu Gegenständen ungültig gemacht werden, wenn der Müllmann den Gegenstand bewegt (sie werden baumelnde Zeigestöcke). Für die Zwischenfunktionsfähigkeit mit dem heimischen Code muss der Müllmann kopieren der Gegenstand-Inhalt zu einer Position außerhalb des Mülls hat Gebiet des Gedächtnisses gesammelt. Eine alternative Annäherung soll den Gegenstand im Gedächtnis befestigen, den Müllmann davon abhaltend, es zu bewegen und dem Gedächtnis zu erlauben, mit heimischen Zeigestöcken direkt geteilt zu werden (und vielleicht Zeigestock-Arithmetik zu erlauben).

Das Kopieren gegen das Zeichen-Und-Kehren gegen das Zeichen und kehrt nicht

Weiter die Unterscheidung zu raffinieren, Sammler verfolgend, kann auch durch das Betrachten geteilt werden, wie die drei Sätze von Gegenständen (weiß, grau, und schwarz) während eines Sammlungszyklus aufrechterhalten werden.

Die aufrichtigste Annäherung ist der Halbraumsammler, der Daten bis 1969. In diesem Bewegen GC Schema wird Gedächtnis in "vom Raum" und "zum Raum" verteilt. Am Anfang werden Gegenstände "im Raum" zugeteilt, bis sie voll werden und eine Sammlung ausgelöst wird. Am Anfang einer Sammlung, "zum Raum" wird "vom Raum", und umgekehrt. Die vom Wurzelsatz erreichbaren Gegenstände werden von "vom Raum" zu "zum Raum" kopiert. Diese Gegenstände werden der Reihe nach gescannt, und alle Gegenstände, zu denen sie hinweisen, werden in "zum Raum" kopiert, bis alle erreichbaren Gegenstände in "zum Raum" kopiert worden sind. Sobald das Programm Ausführung fortsetzt, werden neue Gegenstände wieder "im Raum" zugeteilt, bis es wieder voll ist und der Prozess wiederholt wird. Diese Annäherung ist im Vorteil der Begriffseinfachheit (die drei Gegenstand-Farbensätze werden während des Kopieren-Prozesses implizit gebaut), aber der Nachteil, dass ein (vielleicht) sehr großes aneinander grenzendes Gebiet des freien Gedächtnisses auf jedem Sammlungszyklus notwendigerweise erforderlich ist. Diese Technik ist auch bekannt als Halt-Und-Kopie. Der Algorithmus von Cheney ist eine Verbesserung auf dem Halbraumsammler.

Zeichen- und Kehren-Müllmann erhält wenig (oder zwei) mit jedem Gegenstand aufrecht zu registrieren, ob es weiß oder schwarz ist; der graue Satz wird entweder als eine getrennte Liste (wie der Prozess-Stapel) aufrechterhalten oder ein anderes Bit verwendend. Da der Bezugsbaum während eines Sammlungszyklus überquert wird (die "Zeichen"-Phase), werden diese Bit vom Sammler manipuliert, um den aktuellen Staat zu widerspiegeln. Ein End"Kehren" der Speicherbereiche befreit dann weiße Gegenstände. Zeichen- und Kehren-Strategie hat den Vorteil, dass, sobald der unerreichbare Satz bestimmt wird, entweder ein Bewegen oder nichtbewegende Sammlungsstrategie verfolgt werden können; diese Wahl der Strategie kann sogar an der Durchlaufzeit gemacht werden, weil verfügbares Gedächtnis erlaubt. Es hat den Nachteil von "Bloating"-Gegenständen durch einen kleinen Betrag.

Ein Zeichen und kehrt Müllmann wie das Zeichen-Und-Kehren nicht, erhält wenig mit jedem Gegenstand aufrecht zu registrieren, ob es weiß oder schwarz ist; der graue Satz wird entweder als eine getrennte Liste (wie der Prozess-Stapel) aufrechterhalten oder ein anderes Bit verwendend. Es gibt zwei Schlüsselunterschiede hier. Erstens schwarze und weiße verschiedene Mitteldinge als tun sie im Zeichen und kehren Sammler. In einem "Zeichen und kehren" System nicht, alle erreichbaren Gegenstände sind immer schwarz. Ein Gegenstand wird schwarz zurzeit gekennzeichnet er wird zugeteilt, und es wird schwarz bleiben, selbst wenn es unerreichbar wird. Ein weißer Gegenstand ist unbenutztes Gedächtnis und kann zugeteilt werden. Zweitens kann sich die Interpretation des schwarzen/weißen Bit ändern. Am Anfang kann das schwarze/weiße Bit den Sinn (0=white, 1=black) haben. Wenn eine Zuteilungsoperation jemals scheitert, verfügbares (weißes) Gedächtnis zu finden, das bedeutet, dass alle Gegenstände verwendeter (Schwarzer) gekennzeichnet werden. Der Sinn des schwarzen/weißen Bit wird dann (zum Beispiel, 0=black, 1=white) umgekehrt. Alles wird weiß. Das bricht einen Augenblick lang den invariant, dass erreichbare Gegenstände schwarz sind, aber eine volle Markierungsphase folgt sofort, um sie schwarz wieder zu kennzeichnen. Sobald das getan wird, ist das ganze unerreichbare Gedächtnis weiß. Keine "Kehren"-Phase ist notwendig.

Generational GC (ephemerer GC)

Es ist empirisch bemerkt worden, dass in vielen Programmen die am meisten kürzlich geschaffenen Gegenstände auch diejenigen sind, um am wahrscheinlichsten unerreichbar schnell (bekannt als Säuglingssterblichkeit oder die generational Hypothese) zu werden. Ein generational GC (auch bekannt als ephemerer GC) teilt Gegenstände in Generationen und auf den meisten Zyklen, wird nur die Gegenstände einer Teilmenge von Generationen in den anfänglichen weißen (verurteilten) Satz legen. Außerdem erhält das Laufzeitsystem Kenntnisse dessen aufrecht, wenn Verweisungen Generationen durch das Beobachten der Entwicklung und das Überschreiben von Verweisungen durchqueren. Wenn der Müllmann läuft, kann es im Stande sein, diese Kenntnisse zu verwenden, um zu beweisen, dass einige Gegenstände im anfänglichen weißen Satz unerreichbar sind, ohne den kompletten Bezugsbaum überqueren zu müssen. Wenn die generational Hypothese hält, läuft das auf viel schnellere Sammlungszyklen hinaus, während es noch die meisten unerreichbaren Gegenstände zurückfordert.

Um dieses Konzept durchzuführen, verwenden viele generational Müllmänner getrennte Speichergebiete für verschiedene Alter von Gegenständen. Wenn ein Gebiet voll wird, werden jene wenigen Gegenstände, in denen von älteren Speichergebieten Verweise angebracht wird (kopiert) bis zum folgenden höchsten Gebiet gefördert, und das komplette Gebiet kann dann mit frischen Gegenständen überschrieben werden. Diese Technik erlaubt sehr schnell zusätzliche Müll-Sammlung, da die Müll-Sammlung von nur einem Gebiet auf einmal alles ist, was normalerweise erforderlich ist.

Müll-Sammlung von Generational ist eine heuristische Annäherung, und einige unerreichbare Gegenstände dürfen auf jedem Zyklus nicht zurückgefordert werden. Es kann deshalb gelegentlich notwendig sein, ein volles Zeichen und Kehren oder das Kopieren der Müll-Sammlung durchzuführen, um den ganzen verfügbaren Raum zurückzufordern. Tatsächlich verwenden Laufzeitsysteme für moderne Programmiersprachen (wie Java und das.NET Fachwerk) gewöhnlich eine Hybride der verschiedenen Strategien, die so weit beschrieben worden sind; zum Beispiel könnten die meisten Sammlungszyklen nur auf einige Generationen schauen, während gelegentlich ein Zeichen-Und-Kehren durchgeführt wird, und noch seltener ein volles Kopieren durchgeführt wird, um Zersplitterung zu bekämpfen. Die Begriffe "geringer Zyklus" und "Hauptzyklus" werden manchmal gebraucht, um diese verschiedenen Niveaus der Sammler-Aggression zu beschreiben.

Stop-world gegen den zusätzlichen gegen den Begleitumstand

Einfache stop-world Müllmänner halten völlig Ausführung des Programms, um einen Sammlungszyklus zu führen, so versichernd, dass neue Gegenstände nicht zugeteilt werden und Gegenstände unerreichbar nicht plötzlich werden, während der Sammler läuft.

Das hat den offensichtlichen Nachteil, dass das Programm keine nützliche Arbeit durchführen kann, während ein Sammlungszyklus läuft (manchmal hat die "peinliche Pause" genannt). Stop-world Müll-Sammlung ist deshalb für nicht wechselwirkende Programme hauptsächlich passend. Sein Vorteil besteht darin, dass es sowohl einfacher ist durchzuführen als auch schneller als zusätzliche Müll-Sammlung.

Zusätzliche und gleichzeitige Müllmänner werden entworfen, um diese Störung zu reduzieren, indem sie ihre Arbeit mit der Tätigkeit aus dem Hauptprogramm durchschießen. Zusätzliche Müllmänner führen den Müll-Sammlungszyklus in getrennten Phasen mit der Programm-Ausführung durch, die zwischen jeder Phase (und manchmal während einiger Phasen) erlaubt ist. Gleichzeitige Müllmänner hören Programm-Ausführung überhaupt nicht auf, außer vielleicht kurz, wenn der Ausführungsstapel des Programms gescannt wird. Jedoch nimmt die Summe der zusätzlichen Phasen länger, um zu vollenden, als ein Gruppe-Müll-Sammlungspass, so können diese Müllmänner niedrigeren Gesamtdurchfluss nachgeben.

Sorgfältiges Design ist mit diesen Techniken notwendig, um sicherzustellen, dass das Hauptprogramm den Müllmann und umgekehrt nicht stört; zum Beispiel, wenn das Programm einen neuen Gegenstand zuteilen muss, muss das Laufzeitsystem es eventuell entweder aufheben, bis der Sammlungszyklus abgeschlossen ist, oder benachrichtigen Sie irgendwie den Müllmann, dass dort ein neuer, erreichbarer Gegenstand besteht.

Genau gegen konservative und innere Zeigestöcke

Einige Sammler können alle Zeigestöcke (Verweisungen) in einem Gegenstand richtig identifizieren; diese werden genau (auch genau oder genau) Sammler, das entgegengesetzte Wesen ein Konservativer oder teilweise konservativer Sammler genannt. Konservative Sammler nehmen an, dass jedes Bit-Muster im Gedächtnis ein Zeigestock sein konnte, wenn, interpretiert als ein Zeigestock, es in einen zugeteilten Gegenstand hinweisen würde. Konservative Sammler können falschen positives erzeugen, wo unbenutztes Gedächtnis wegen der unpassenden Zeigestock-Identifizierung nicht veröffentlicht wird. Das ist nicht immer ein Problem in der Praxis, wenn das Programm viele Daten nicht behandelt, die misidentified als ein Zeigestock leicht sein konnten. Falsche positives sind allgemein auf 64-Bit-Systemen weniger problematisch als auf 32-Bit-Systemen, weil die Reihe von gültigen Speicheradressen dazu neigt, ein winziger Bruchteil der Reihe von 64-Bit-Werten zu sein. So wird ein willkürliches 64-Bit-Muster kaum einen gültigen Zeigestock nachahmen. Ob ein genauer Sammler praktisch ist, gewöhnlich hängt von den Typ-Sicherheitseigenschaften der fraglichen Programmiersprache ab. Ein Beispiel, für das ein konservativer Müllmann erforderlich wäre, ist die c Sprache, die getippten (nichtleeren) Zeigestöcken erlaubt, Typ-Wurf in ungetippte (leere) Zeigestöcke, und umgekehrt zu sein.

Ein zusammenhängendes Problem betrifft innere Zeigestöcke oder Zeigestöcke zu Feldern innerhalb eines Gegenstands. Wenn die Semantik einer Sprache innere Zeigestöcke erlaubt, dann kann es viele verschiedene Adressen geben, die sich auf Teile desselben Gegenstands beziehen können, der Bestimmung kompliziert, ob ein Gegenstand Müll ist oder nicht. Ein Beispiel dafür ist der C ++ Sprache, auf der Mehrfachvererbung Zeigestöcke veranlassen kann, Gegenstände zu stützen, verschiedene Adressen zu haben. Sogar auf Sprachen wie Java können innere Zeigestöcke während der Berechnung, sagen wir, einer Reihe-Element-Adresse bestehen. In einem dicht optimierten Programm kann der entsprechende Zeigestock zum Gegenstand selbst in seinem Register überschrieben worden sein, so müssen solche inneren Zeigestöcke gescannt werden.

Leistungsimplikationen

Verfolgende Müllmänner verlangen eine implizite Durchlaufzeit oben, die außer der Kontrolle des Programmierers sein kann, und manchmal zu Leistungsproblemen führen kann. Zum Beispiel können allgemein verwendete stop-world Müllmänner, der Pause-Programm-Ausführung in willkürlichen Zeiten, Müll-Sammlung unpassend für einige eingebettete Systeme, Hochleistungsserver-Software und Anwendungen mit Echtzeitbedürfnissen machen.

Manuelle Haufen-Zuteilung:

  • Suche best/first-fit Block der genügend Größe
  • freie Listenwartung

Müll-Sammlung:

  • machen Sie erreichbare Gegenstände ausfindig
  • kopieren Sie erreichbare Gegenstände für bewegende Sammler
  • Lesen/Schreiben-Barrieren für zusätzliche Sammler
  • Suche best/first-fit blockiert und freie Listenwartung für nichtbewegende Sammler

Es ist schwierig, die zwei Fälle direkt zu vergleichen, weil ihr Verhalten von der Situation abhängt. Zum Beispiel, im besten Fall für ein Müll-Sammeln-System, erhöht Zuteilung gerade einen Zeigestock, aber im besten Fall für die manuelle Haufen-Zuteilung erhält der Verteiler freelists spezifischer Größen aufrecht, und Zuteilung verlangt nur im Anschluss an einen Zeigestock. Jedoch, diese Größe-Abtrennung verursachen gewöhnlich einen großen Grad der Außenzersplitterung, die einen nachteiligen Einfluss auf Verhalten des geheimen Lagers haben kann. Die Speicherzuteilung in einem Müll hat sich versammelt Sprache kann mit der Haufen-Zuteilung hinter den Kulissen durchgeführt werden (anstatt einfach einen Zeigestock zu erhöhen), so gelten die Leistungsvorteile, die oben verzeichnet sind, in diesem Fall nicht notwendigerweise. In einigen Situationen, hat am meisten namentlich Systeme eingebettet, es ist möglich, sowohl Müll-Sammlung als auch Haufen-Management oben durch das Vorzuteilen von Lachen des Gedächtnisses und das Verwenden einer Gewohnheit, Leichtgewichtsschemas für allocation/deallocation zu vermeiden.

Die Gemeinkosten dessen schreiben, dass Barrieren mit größerer Wahrscheinlichkeit in einem befehlend-artigen Programm bemerkenswert sein werden, das oft Zeigestöcke in vorhandene Datenstrukturen schreibt als in einem funktionell-artigen Programm, das Daten nur einmal baut und sie nie ändert.

Einige Fortschritte in der Müll-Sammlung können als Reaktionen zu Leistungsproblemen verstanden werden. Frühe Sammler waren stop-world Sammler, aber die Leistung dieser Annäherung lenkte in interaktiven Anwendungen ab. Zusätzliche Sammlung hat diese Störung, aber auf Kosten der verminderten Leistungsfähigkeit wegen des Bedürfnisses nach Barrieren vermieden. Sammlungstechniken von Generational werden sowohl mit stop-world als auch mit zusätzlichen Sammlern verwendet, um Leistung zu vergrößern; der Umtausch besteht darin, dass ein Müll als solcher für den längeren nicht entdeckt wird als normal.

Determinismus

  • Nachforschung der Müll-Sammlung ist im Timing der Gegenstand-Fertigstellung nicht deterministisch. Ein Gegenstand, der berechtigt für die Müll-Sammlung wird, wird gewöhnlich schließlich aufgeräumt, aber es gibt keine Garantie, wenn (oder selbst wenn), der geschehen wird. Das ist ein Problem für die Programm-Genauigkeit, wenn Gegenstände an Nichtspeichermittel gebunden werden, deren Ausgabe ein äußerlich sichtbares Programm-Verhalten, wie das Schließen einer Netzverbindung, die Ausgabe eines Geräts oder das Schließen einer Datei ist. Eine Müll-Sammlungstechnik, die Determinismus in dieser Beziehung zur Verfügung stellt, ist das Bezugszählen.
  • Müll-Sammlung kann einen nichtdeterministischen Einfluss auf die Ausführungszeit, durch das potenzielle Einführen von Pausen in die Ausführung eines Programms haben, die mit dem Algorithmus nicht aufeinander bezogen werden, der wird bearbeitet. Unter der Nachforschung der Müll-Sammlung kann die Bitte, einen neuen Gegenstand zuzuteilen, manchmal schnell zurückkehren, und in anderen Zeiten lösen einen langen Müll-Sammlungszyklus aus. Unter dem Bezugszählen, wohingegen die Zuteilung von Gegenständen gewöhnlich, decrementing eine Verweisung schnell ist, ist nichtdeterministisch, da eine Verweisung Null erreichen kann, recursion zur Verminderung die Bezugszählungen anderer Gegenstände auslösend, die dieser Gegenstand hält.

Echtzeitmüll-Sammlung

Während Müll-Sammlung allgemein nichtdeterministisch ist, ist es möglich, es in harten Echtzeitsystemen zu verwenden. Ein Echtzeitmüllmann sollte versichern, dass sogar im Grenzfall es eine bestimmte Anzahl von rechenbetonten Mitteln zu Mutator-Fäden widmen wird. Einem Echtzeitmüllmann auferlegte Einschränkungen sind gewöhnlich entweder Arbeit gestützt oder gestützte Zeit. Gestützte Einschränkung einer Zeit würde ähnlich sein: Innerhalb jedes Males sollte dem Fenster der Dauer T, mutator Fäden erlaubt werden, mindestens für die Zeit von Tm zu laufen. Weil Arbeit Analyse gestützt hat, wird MMU (minimale mutator Anwendung) gewöhnlich als eine Echtzeiteinschränkung für den Müll-Sammlungsalgorithmus verwendet.

Eine der ersten Durchführungen der Echtzeitmüll-Sammlung für den JVM war Arbeit am Metronom-Algorithmus. Es gibt andere kommerzielle Durchführungen.

Das Bezugszählen

Das Bezugszählen ist eine Form der Müll-Sammlung, wodurch jeder Gegenstand eine Zählung der Zahl von Verweisungen darauf hat. Müll wird identifiziert, indem er eine Bezugszählung der Null gehabt wird. Eine Bezugszählung eines Gegenstands wird erhöht, wenn eine Verweisung darauf, und decremented geschaffen wird, wenn eine Verweisung zerstört wird. Das Gedächtnis des Gegenstands wird zurückgefordert, wenn die Zählung Null erreicht.

Im Vergleich zur Nachforschung der Müll-Sammlung versichert das Bezugszählen, dass Gegenstände zerstört werden, sobald sie unerreichbar werden (das Annehmen, dass es keine Bezugszyklen gibt), und gewöhnlich nur Zugriffsgedächtnis, das entweder in geheimen Zentraleinheitslagern in Gegenständen ist, befreit, oder direkt von denjenigen angespitzt zu werden, und so dazu neigt, bedeutende negative Nebenwirkungen auf dem geheimen Zentraleinheitslager und der virtuellen Speicheroperation nicht zu haben.

Es gibt einige Nachteile zum Bezugszählen:

  • Wenn sich zwei oder mehr Gegenstände auf einander beziehen, können sie einen Zyklus schaffen, wodurch keiner gesammelt wird, weil ihre gegenseitigen Verweisungen nie ihre Bezugszählungen Null werden lassen. Einige Müll-Sammlungssysteme mit dem Bezugszählen (wie dasjenige in CPython) verwenden spezifische Zyklus entdeckende Algorithmen, um sich mit diesem Problem zu befassen. Eine andere Strategie ist, schwache Verweisungen für die "backpointers" zu verwenden, die Zyklen schaffen. Unter dem Bezugszählen ist eine schwache Verweisung einer schwachen Verweisung unter einem Nachforschungsmüllmann ähnlich. Es ist ein spezieller Bezugsgegenstand, dessen Existenz die Bezugszählung des Referent-Gegenstands nicht erhöht. Außerdem ist eine schwache Verweisung darin sicher, wenn der Referent-Gegenstand Müll, jede schwache Verweisung darauf Versehen wird, anstatt erlaubt zu werden, baumeln zu müssen, bedeutend, dass er sich in einen voraussagbaren Wert wie eine ungültige Verweisung verwandelt.
  • In naiven Durchführungen verlangt jede Anweisung einer Verweisung und jeder Verweisung, die aus dem Spielraum häufig fällt, Modifizierungen von einem oder mehr Bezugsschaltern. Jedoch, im allgemeinen Fall, wenn eine Verweisung von einer Außenspielraum-Variable in eine innere Spielraum-Variable kopiert, solch wird, dass die Lebenszeit der inneren Variable durch die Lebenszeit der Außen-begrenzt wird, kann die erhöhende Verweisung beseitigt werden. Die Außenvariable "besitzt" die Verweisung. Auf der Programmiersprache C ++ wird diese Technik sogleich durchgeführt und mit dem Gebrauch von Verweisungen demonstriert. Verweisung, die in C ++ zählt, wird gewöhnlich mit "kluge Zeigestöcke" durchgeführt, wessen Konstrukteure, destructors und Anweisungsmaschinenbediener die Verweisungen führen. Ein kluger Zeigestock kann bezüglich einer Funktion passiert werden, die das Bedürfnis zur Kopie-Konstruktion eine neue Verweisung vermeidet (der die Bezugszählung auf dem Zugang in die Funktion vergrößern und es auf dem Ausgang vermindern würde). Stattdessen erhält die Funktion eine Verweisung auf den klugen Zeigestock, der billig erzeugt wird.
  • Wenn verwendet, in einer Mehrgewindeumgebung müssen diese Modifizierungen (Zunahme und Verminderung) eventuell Atomoperationen solcher als vergleichen-und-tauschen mindestens für irgendwelche Gegenstände sein, die geteilt, oder potenziell unter vielfachen Fäden geteilt werden. Atomoperationen sind auf einem Mehrverarbeiter teuer und noch teurer, wenn mit ihnen mit Softwarealgorithmen wettgeeifert werden muss. Es ist möglich, dieses Problem durch das Hinzufügen von Bezugszählungen pro Faden pro Zentraleinheit und nur das Zugreifen auf die globale Bezugszählung zu vermeiden, wenn die lokalen Bezugszählungen werden oder nicht mehr Null (oder wechselweise mit einem binären Baum von Bezugszählungen sind, oder sogar deterministische Zerstörung als Entgelt dafür aufgebend, eine globale Bezugszählung überhaupt zu nicht haben), aber das fügt bedeutendes Gedächtnis oben hinzu und neigt so dazu, nur in speziellen Fällen nützlich zu sein (es, wird zum Beispiel, im Bezugszählen von Kernmodulen von Linux verwendet).
  • Naive Durchführungen des Bezugszählens stellen Echtzeitverhalten nicht im Allgemeinen zur Verfügung, weil jede Zeigestock-Anweisung mehrere Gegenstände begrenzt nur durch die zugeteilte Gesamtspeichergröße potenziell veranlassen kann, rekursiv befreit zu werden, während der Faden unfähig ist, andere Arbeit durchzuführen. Es ist möglich, dieses Problem durch das Beauftragen des Freigebens von Gegenständen zu vermeiden, deren Bezugszählung auf Null zu anderen Fäden auf Kosten von zusätzlichem oben gefallen ist.

Flucht-Analyse

Flucht-Analyse kann verwendet werden, um Haufen-Zuteilungen umzuwandeln, um Zuteilungen aufzuschobern, so musste das Reduzieren des Betrags der Arbeit vom Müllmann getan werden.

Übersetzungszeit

Übersetzungszeit-Müll-Sammlung ist eine Form des statischen Analyse-Erlauben-Gedächtnisses, das wiederzuverwenden und gestützt auf während der Kompilation bekanntem invariants zurückzufordern ist. Diese Form der Müll-Sammlung ist auf der Quecksilberprogrammiersprache studiert worden

Verfügbarkeit

Im Allgemeinen werden Programmiersprachen des höheren Niveaus mit größerer Wahrscheinlichkeit Müll-Sammlung als eine Standardeigenschaft haben. Auf Sprachen, die gebaut in der Müll-Sammlung nicht haben, kann sie häufig durch eine Bibliothek, als mit dem Müllmann von Boehm für C und C ++ hinzugefügt werden. Diese Annäherung ist nicht ohne Nachteile wie sich ändernde Gegenstand-Entwicklungs- und Zerstörungsmechanismen.

Die meisten funktionellen Programmiersprachen, wie ML, Haskell, und APL, ließen Müll-Sammlung darin bauen. Lispeln, das funktionelle Programmierung eingeführt hat, ist besonders bemerkenswert, um diesen Mechanismus einzuführen.

Andere dynamische Sprachen, wie Ruby (aber nicht Perl 5, oder PHP, die das Bezugszählen verwenden), neigen auch dazu, GC zu verwenden. Objektorientierte Programmiersprachen wie Plausch, Java und ECMAScript stellen gewöhnlich integrierte Müll-Sammlung zur Verfügung. Bemerkenswerte Ausnahmen sind C ++ und Delphi, die destructors haben. Ziel-C hat es nicht traditionell gehabt, aber ObjC 2.0, wie durchgeführt, durch den Apfel für Mac OS X verwendet einen Laufzeitsammler entwickelt innerbetrieblich, während das GNUstep-Projekt einen Sammler von Boehm verwendet.

Historisch haben Sprachen, die für Anfänger, solcher als beabsichtigt sind, GRUNDLEGEND und Firmenzeichen, häufig Müll-Sammlung für Haufen-zugeteilte Datentypen der variablen Länge, wie Schnuren und Listen, um nicht Last-Programmierern mit dem manuellen Speichermanagement verwendet. Auf frühen Mikrocomputern, mit ihrem beschränkten Gedächtnis und langsamen Verarbeitern, konnte GRUNDLEGENDE Müll-Sammlung häufig anscheinend zufällige, unerklärliche Pausen in der Mitte der Programm-Operation verursachen. Einige GRUNDLEGENDE Dolmetscher wie auf der Familie der Apple II GRUNDLEGENDER Applesoft, hatte schrecklich ineffiziente Müllmänner für Schnuren, die wiederholt die Schnur-Deskriptoren für die Schnur gescannt haben, die die höchste Adresse hat, um es zum hohen Gedächtnis zusammenzupressen. Diese Schnur, die auf einmal Schleife bearbeitet, ist auf O (N*N) Zeitleistung in der Zahl von Schnuren hinausgelaufen, die eine mehr als eine Minute lange Pause in die Ausführung von mit der Schnur intensiven Programmen einführen würden. Ein Ersatzmüllmann für den Applesoft GRUNDLEGEND veröffentlicht im Anruf-A.P.P.L.E. (Januar 1981, Seiten 40-45, Randy Wiggington) hat eine Gruppe von Schnuren in jedem identifiziert, den Haufen übertragen, eine Pause von zwei Minuten in weniger als eine Sekunde abhängig von der Größe der Gruppe reduzierend. Andere Annäherungen wurden veröffentlicht, aber niemand hat es jemals in eine neue Revision des GRUNDLEGENDEN Dolmetschers gemacht.

Beschränkte Umgebungen

Müll-Sammlung wird auf eingebetteten oder schritthaltenden Systemen wegen des wahrgenommenen Bedürfnisses nach der sehr dichten Kontrolle über den Gebrauch von beschränkten Mitteln selten verwendet. Jedoch sind mit solchen beschränkten Umgebungen vereinbare Müllmänner entwickelt worden. Das Microsoft.NET Mikroplattform von Fachwerk und Java, Mikroausgabe ist eingebettete Softwareplattformen, die, wie ihre größeren Vetter, Müll-Sammlung einschließen.

Siehe auch

  • Internationales Symposium auf dem Speichermanagement
  • Müll der erste Sammler

Weiterführende Literatur

Außenverbindungen

Durchführungen

ist

Boeing C-17 Globemaster III / Canidae
Impressum & Datenschutz