Müllsammlung (Informatik)

Stop-and-Copy-Müllsammlung in a Lisp -Architektur:[1] Das Gedächtnis ist unterteilt in Arbeiten und frei Erinnerung; In der ersteren werden neue Objekte zugewiesen. Wenn es voll (abgebildet) ist, wird die Müllsammlung durchgeführt: Alle noch verwendeten Datenstrukturen werden durch Zeigerverfolgung lokalisiert und an aufeinanderfolgenden Standorten im freien Speicher kopiert.
Danach wird der Arbeitsgedächtnisinhalt zugunsten der komprimierten Kopie und der Rolle von verworfen Arbeiten und frei Speicher werden ausgetauscht (dargestellt).

Im Informatik, Müllsammlung (GC) ist eine Form der Automatik Speicherverwaltung. Das Müllsammler Versuche, das Gedächtnis zurückzugewinnen, das vom Programm zugewiesen wurde, aber nicht mehr verwiesen wird; Ein solches Gedächtnis heißt Müll. Die Müllsammlung wurde vom amerikanischen Informatiker erfunden John McCarthy um 1959 zur Vereinfachung des manuellen Speichermanagements in Lispeln.[2]

Die Müllsammlung lindert den Programmierer davon Manuellem Speichermanagement, wo der Programmierer angibt, welche Objekte zu allodieren und zum Speichersystem zurückkehren und wann dies zu tun ist. Andere, ähnliche, Techniken umfassen Stapelzuweisung, Region Inferenzund Gedächtnisbesitz und Kombinationen davon. Die Müllsammlung kann einen erheblichen Teil der Gesamtverarbeitungszeit eines Programms anwenden und einen Auswirkungen haben Leistung als Ergebnis.

Andere Ressourcen als Speicher, wie z. Netzwerkstücken, Datenbank Griffe, Fenster, Datei Deskriptoren und Gerätedeskriptoren werden normalerweise nicht von der Müllsammlung, sondern von anderen behandelt Methoden (z.B. Zerstörer). Einige solche Methoden enthält auch das Gedächtnis.

Überblick

Viele Programmiersprachen Erfordernde Müllsammlung entweder als Teil der Sprachspezifikation (z.B., Rpl, Java, C#, D,[3] gehenund die meisten Skriptsprachen) oder effektiv für die praktische Implementierung (z. B. formale Sprachen wie Lambda -Kalkül). Diese sollen sein garbage gesammelte Sprachen. Andere Sprachen, wie z. C und C ++, wurden für die Verwendung mit manueller Speicherverwaltung ausgelegt, verfügen jedoch über müllsambte Implementierungen. Einige Sprachen wie Ada, Modula-3, und C ++/cli, sowohl die Müllsammlung als auch die Müllsammlung erlauben und Manuellem Speichermanagement Koexistiere in derselben Anwendung mit separat Haufen für gesammelte und manuell verwaltete Objekte. Wieder andere, mögen D, sind garbage gesammelt, ermöglichen dem Benutzer jedoch, Objekte manuell zu löschen oder sogar die Müllsammlung vollständig zu deaktivieren, wenn Geschwindigkeit erforderlich ist.

Obwohl viele Sprachen GC in ihre integrieren Compiler und Laufzeitsystem, Post-hoc GC -Systeme existieren auch, wie z. Automatische Referenzzählung (BOGEN). Einige davon Post-hoc GC -Systeme erfordern keine Neukompilation. Post-hoc GC wird manchmal genannt Wurfsammlung, Sammlung, Um es von gewöhnlicher GC zu unterscheiden.

Vorteile

GC befreit den Programmierer von manuellem Anmelden des Speichers. Dies hilft, einige Arten von zu vermeiden Fehler:

  • Zeiger baumeln, die auftreten, wenn ein Stück Erinnerung befreit wird, während es noch gibt Zeiger dazu, und einer dieser Zeiger ist Derferenziert. Bis dahin kann der Speicher mit unvorhersehbaren Ergebnissen zu einer anderen Verwendung zugewiesen worden sein.
  • Doppelte freie Fehler, die auftreten, wenn das Programm versucht, einen bereits wieder vergebenen Speicherbereich zu befreien.
  • Bestimmte Arten von Speicherlecks, in dem ein Programm nicht frei von Objekten bewohnt wird, die geworden sind unerreichbar, was zu Erschöpfung der Erinnerung führen kann.

Nachteile

GC verwendet Computerressourcen, um zu entscheiden, welcher Speicher frei ist. Daher ist die Strafe für die Bequemlichkeit, die Lebensdauer des Objekts nicht manuell im Quellcode zu kommentieren Überkopf, was die Programmleistung beeinträchtigen kann.[4] Ein von Experten begutachteter Papier aus dem Jahr 2005 kam zu dem Schluss, dass GC das Fünf-fache Speicher benötigt, um diesen Overhead zu kompensieren und mit idealisiertem explizitem Speichermanagement so schnell wie das gleiche Programm abzubauen. Der Vergleich wird jedoch mit einem Programm durchgeführt, das durch Einfügen von Deallocationsaufrufen mit einem generiert wird Orakel, implementiert durch Sammeln von Spuren aus Programmen, die unter einem Profiler ausgeführt werden, und das Programm ist nur für eine bestimmte Ausführung des Programms korrekt.[5] Die Interaktion mit Gedächtnishierarchie -Effekten kann diesen Overhead unter Umständen unerträglich machen, die bei Routinetests schwer vorherzusagen oder zu erkennen sind. Die Auswirkungen auf die Leistung wurden von Apple als Grund dafür gegeben, keine Müllsammlung zu übernehmen in iOSobwohl es das gewünschte Feature ist.[6]

Der Moment, in dem der Müll tatsächlich gesammelt wird, kann unvorhersehbar sein, was zu Ständen (Pausen zum Verschieben/freien Speicher) während einer Sitzung verstreut ist. Unvorhersehbare Stände können in nicht akzeptabel sein in Echtzeitumgebungen, in Transaktionsverarbeitungoder in interaktiven Programmen. Inkrementelle, gleichzeitige und Echtzeit-Müllsammler behandeln diese Probleme mit unterschiedlichen Kompromisse.

Strategien

Verfolgung

Verfolgung von Müllsammlung ist die häufigste Art der Müllsammlung, so dass sich die "Müllsammlung" oft auf die Verfolgung der Müllsammlung bezieht und nicht auf andere Methoden wie z. Referenzzählung. Die Gesamtstrategie besteht darin, zu bestimmen, welche Objekte Müll erhoben werden sollten, indem sie nachverfolgt werden, welche Objekte sind erreichbar durch eine Kette von Referenzen aus bestimmten Wurzelobjekten und den Rest als Müll und Sammeln. Es gibt jedoch eine große Anzahl von Algorithmen, die bei der Implementierung verwendet werden, mit sehr unterschiedlicher Komplexität und Leistungsmerkmalen.

Referenzzählung

In Referenzzählmüllsammlung enthält jedes Objekt die Anzahl der Verweise darauf. Der Müll wird durch eine Referenzzahl von Null identifiziert. Die Referenzzahl eines Objekts wird erhöht, wenn eine Referenz darauf erstellt wird, und verringert sich, wenn eine Referenz zerstört wird. Wenn die Anzahl Null erreicht ist, wird das Gedächtnis des Objekts zurückgefordert.[7]

Wie bei der manuellen Speicherverwaltung und im Gegensatz zur Verfolgung der Müllsammlung garantiert die Referenzzählungen, dass Objekte zerstört werden, sobald ihre letzte Referenz zerstört wird, und greifen normalerweise nur auf Speicher zu, die sich entweder in befindet CPU -Caches, in Objekten, die befreit oder direkt von diesen hingewiesen werden sollen, und neigt daher dazu, keine signifikanten negativen Nebenwirkungen auf den CPU -Cache zu haben und virtueller Speicher Betrieb.

Es gibt eine Reihe von Nachteilen, um die Referenzzählung zu erzielen. Dies kann im Allgemeinen durch ausgefeiltere Algorithmen gelöst oder gemindert werden:

Fahrräder
Wenn sich zwei oder mehr Objekte auf einander beziehen, können sie einen Zyklus erstellen, in dem keiner von beiden gesammelt wird, da ihre gegenseitigen Referenzen niemals zulassen, dass ihre Referenzzahlen Null werden. Einige Müllsammelsysteme unter Verwendung der Referenzzählung (wie die in Cpython) Verwenden Sie spezifische Zyklus-Erkennungsalgorithmen, um sich mit diesem Problem zu befassen.[8] Eine andere Strategie ist die Anwendung Schwache Referenzen Für die "Backpointers", die Zyklen erzeugen. Bei Referenzzählung ähnelt eine schwache Referenz einer schwachen Referenz unter einem Verfolgung von Müllsammler. Es ist ein spezielles Referenzobjekt, dessen Existenz die Referenzzahl des Referenzobjekts nicht erhöht. Darüber hinaus ist eine schwache Referenz darin sicher, wenn das Referenzobjekt zu Müll wird, jeder schwache Hinweis darauf Verfallenanstatt zu gestartet zu bleiben, was bedeutet, dass es zu einem vorhersehbaren Wert wie einer Nullreferenz wird.
Space Overhead (Referenzzahl)
Für die Referenzzählung muss Platz für jedes Objekt zugewiesen werden, um seine Referenzzahl zu speichern. Die Anzahl kann neben dem Speicher des Objekts oder in einer Seitentabelle an einem anderen Fall gespeichert werden. In beiden Fällen erfordert jedes einzelne Referenzobjekt einen zusätzlichen Speicher für seine Referenzzahl. Der Speicherplatz mit der Größe eines nicht signierten Zeigers wird üblicherweise für diese Aufgabe verwendet, was bedeutet, dass für jedes Objekt 32 oder 64 Bit Reference Count -Speicher zugewiesen werden müssen. Auf einigen Systemen kann es möglich sein, diesen Overhead mit a zu mildern Tagged Zeiger Aufbewahrung der Referenzzahl in nicht verwendeten Bereichen des Gedächtnisses des Objekts. Oft erlaubt eine Architektur nicht, dass Programme nicht auf die gesamte Palette von Speicheradressen zugreifen können, die in ihrer nativen Zeigergröße gespeichert werden könnten. Eine bestimmte Anzahl von hohen Bits in der Adresse wird entweder ignoriert oder muss Null sein. Wenn ein Objekt an einem bestimmten Ort zuverlässig einen Zeiger hat, kann die Referenzzahl in den nicht verwendeten Teilen des Zeigers gespeichert werden. Zum Beispiel jedes Objekt in Ziel c Hat einen Zeiger auf seine Klasse Zu Beginn seiner Erinnerung; auf der ARM64 Architektur Verwenden iOS 7, 19 unbenutzte Teile dieses Klassenzeigers werden verwendet, um die Referenzzahl des Objekts zu speichern.[9][10]
Geschwindigkeitsaufwand (Inkrement/Dekrement)
Bei naiven Implementierungen erfordert jede Zuordnung einer Referenz und jede Referenz, die aus dem Zielfernrohr fällt, häufig Änderungen eines oder mehrerer Referenzzähler. In einem gemeinsamen Fall, wenn eine Referenz aus einer äußeren Bereichsvariable in eine innere Bereichsvariable kopiert wird, so dass die Lebensdauer der inneren Variablen durch die Lebensdauer der äußeren begrenzt wird, kann die Referenzinkrementierung beseitigt werden. Die äußere Variable "besitzt" die Referenz. In der Programmiersprache C ++ wird diese Technik leicht implementiert und mit Verwendung von demonstriert Const Verweise. Die Referenzzählung in C ++ wird normalerweise mithilfe von "implementiert"Smart Zeiger"[11] Wessen Konstruktoren, Zerstörer und Zuordnungsbetreiber verwalten die Referenzen. Ein intelligenter Zeiger kann unter Bezugnahme auf eine Funktion übergeben werden, wodurch ein neuer Smart-Zeiger kopiert werden muss (was die Referenzzahl beim Eintritt in die Funktion erhöhen und beim Ausgang verringern würde). Stattdessen empfängt die Funktion einen Verweis auf den intelligenten Zeiger, der kostengünstig erzeugt wird. Die Deutsch-Bobrow-Methode der Referenzzählung nutzt die Tatsache, dass die meisten Referenzzähler-Updates tatsächlich durch Referenzen generiert werden, die in lokalen Variablen gespeichert sind. Es ignoriert diese Referenzen und zählt nur Referenzen auf dem Haufen, aber bevor ein Objekt mit Referenzzahl Null gelöscht werden kann, muss das System mit einem Scan des Stapels und Registern verifizieren, dass kein anderer Hinweis darauf immer noch vorhanden ist. Eine weitere erhebliche Abnahme des Overheads bei Counter Updates kann durch Update -Koaleszenzierung von Levanoni und eingeführt werden Petrank.[12][13] Betrachten Sie einen Zeiger, der in einem bestimmten Intervall der Ausführung mehrmals aktualisiert wird. Es zeigt zuerst auf ein Objekt O1dann zu einem Objekt O2und so weiter, bis es am Ende des Intervalls auf ein Objekt zeigt An. Ein Referenzzählalgorithmus würde normalerweise ausgeführt RC (O1)-, RC (O2) ++, RC (O2)-, RC (O3) ++, RC (O3)-, ..., RC (ON) ++. Die meisten dieser Updates sind jedoch überflüssig. Um die Referenzzahl am Ende des Intervalls ordnungsgemäß auszuwerten, reicht sie aus, um durchzuführen RC (O1)- und RC (ON) ++. Levanoni und Petrank haben eine Beseitigung von mehr als 99% der Counteraktualisierungen in typischen Java -Benchmarks gemessen.
Erfordert Atomizität
Wenn in a verwendet Multithread Umgebung, diese Modifikationen (Inkrement und Dekrement) müssen möglicherweise sein atomare Operationen wie zum Beispiel vergleiche und swapZumindest für Objekte, die geteilt oder möglicherweise unter mehreren Threads geteilt werden. Atomoperationen sind bei einem Multiprozessor teuer und sogar noch teurer, wenn sie mit Softwarealgorithmen emuliert werden müssen. Es ist möglich, dieses Problem zu vermeiden, indem pro-thread- oder pro-CPU-Referenzzählungen hinzugefügt und nur auf die globale Referenzzahl zugreifen, wenn die lokalen Referenzzählungen nicht mehr Null werden oder nicht mehr (oder alternativ mit einem binären Referenzbaum) oder mit einem binären Referenzbaum oder nicht mehr sind Sogar die deterministische Zerstörung im Austausch für keine globale Referenzzahl aufgeben), dies fügt jedoch einen signifikanten Speicheraufwand hinzu und ist somit nur in besonderen Fällen nützlich (beispielsweise wird es bei der Referenzzählung von Linux -Kernelmodulen verwendet ). Aktualisieren Sie das Koalescing von Levanoni und Petrank[12][13] Kann verwendet werden, um alle atomaren Operationen aus dem Schreibbarrier zu beseitigen. Zähler werden im Verlauf der Programmausführung nie von den Programm -Threads aktualisiert. Sie werden nur vom Kollektor modifiziert, der als einzelner zusätzlicher Thread ohne Synchronisation ausgeführt wird. Diese Methode kann als Stop-the-World-Mechanismus für parallele Programme und auch mit einem gleichzeitigen Referenzzählsammler verwendet werden.
Nicht in Echtzeit
Naive Implementierungen der Referenzzählung bieten im Allgemeinen kein Echtzeitverhalten, da jede Zeigerzuweisung möglicherweise dazu führen kann, dass eine Reihe von Objekten, die nur durch die gesamte zugewiesene Speichergröße begrenzt sind, rekursiv befreit werden, während der Thread keine andere Arbeiten ausführen kann. Es ist möglich, dieses Problem zu vermeiden, indem die Freilegung nicht referenzierter Objekte auf andere Threads auf Kosten des zusätzlichen Overheads delegiert.

Fluchtanalyse

Fluchtanalyse ist eine Kompilierzeittechnik, die konvertieren kann Heap -Zuteilungen zu Stapelzuweisungen, damit die Menge an Müllsammlung reduziert wird. Diese Analyse bestimmt, ob ein innerhalb einer Funktion zugeteiltes Objekt außerhalb davon zugänglich ist. Wenn festgestellt wird, dass eine funktionierende Allokation für eine andere Funktion oder einen anderen Faden zugänglich ist, soll die Zuordnung "entkommen" und nicht auf dem Stapel durchgeführt werden. Andernfalls kann das Objekt direkt auf dem Stapel zugeordnet und freigegeben werden, wenn die Funktion zurückgibt, wobei die Kosten des Haufens und der damit verbundenen Speicherverwaltungskosten umgehen.[14]

Verfügbarkeit

Allgemein gesagt, Programmiersprachen höherer Ebene Es ist wahrscheinlicher, dass die Müllsammlung als Standardfunktion verfügt. In einigen Sprachen, in denen keine Müllsammlung eingebaut ist, kann sie wie bei der über eine Bibliothek hinzugefügt werden Boehm Garbage Collector Für C und C ++.

Die meisten Funktionale Programmiersprachen, wie zum Beispiel Ml, Haskell, und Apllassen Sie die Müllsammlung eingebaut. Lispeln ist besonders bemerkenswert wie der erste Funktionelle Programmiersprache und die erste Sprache, um die Müllsammlung einzuführen.[15]

Andere dynamische Sprachen, wie z. Rubin und Julia (aber nicht Perl5 oder Php vor Version 5.3,[16] die beide Referenzzählung verwenden), JavaScript und ECMaskript Neige auch dazu, GC zu verwenden. Objekt orientierte Programmierung Sprachen wie Smalltalk, Rpl und Java Normalerweise integrierte Müllsammlung anbieten. Bemerkenswerte Ausnahmen sind C ++ und Delphi, die haben Zerstörer.

BASIC

BASIC und Logo Halten Sie häufig die Müllsammlung für Datentypen mit variabler Länge wie Zeichenfolgen und Listen verwendet, um Programmierer nicht mit Speicherverwaltungsdetails zu belasten. Auf der Altair 8800Programme mit vielen Saitenvariablen und wenig Saitenraum können aufgrund der Müllsammlung lange Pausen verursachen.[17] Ähnlich das Apfelsoft Basic Der Müllkollektionalgorithmus von Interpreter scannt wiederholt die String -Deskriptoren für die Zeichenfolge mit der höchsten Adresse, um sie in Richtung eines hohen Speichers zu verdichten, was dazu führt Leistung[18] und pausiert zwischen wenigen Sekunden bis ein paar Minuten.[19] Ein Ersatzmüllsammler für Applesoft Basic by Randy Wigginton Identifiziert eine Gruppe von Saiten in jedem Pass über dem Haufen und verkürzt die Sammlungszeit dramatisch.[20] Basic.System, veröffentlicht mit Prodos 1983 bietet ein Fenstermüllsammler für Basic, das um ein Vielfaches schneller ist.[21]

Ziel c

Während Ziel c hatte traditionell keine Müllsammlung mit der Veröffentlichung von OS X 10.5 in 2007 Apfel eingeführte Müllsammlung für Ziel c2.0 unter Verwendung eines internen entwickelten Laufzeitsammlers.[22] Mit der Veröffentlichung von 2012 von jedoch OS X 10.8Die Müllsammlung wurde zugunsten von veraltet Llvm's Automatischer Referenzzähler (ARC), das mit eingeführt wurde OS X 10.7.[23] Darüber hinaus verbietet Apple seit Mai 2015 sogar die Verwendung der Müllsammlung für neue OS X -Anwendungen in der Appstore.[24][25] Zum iOSDie Müllsammlung wurde aufgrund von Problemen bei der Reaktionsfähigkeit und Leistung von Anwendungen noch nie eingeführt.[6][26] Stattdessen verwendet iOS ARC.[27][28]

Begrenzte Umgebungen

Die Müllsammlung wird selten verwendet eingebettet oder Echtzeitsysteme aufgrund des üblichen Bedarfs an sehr strengen Kontrolle über die Verwendung begrenzter Ressourcen. Es wurden jedoch Müllsammler entwickelt, die mit vielen begrenzten Umgebungen kompatibel sind.[29] Das Microsoft .NET Micro Framework, .Net nanoframework[30] und Java -Plattform, Micro Edition sind eingebettete Softwareplattformen, die wie ihre größeren Cousins ​​die Müllsammlung enthalten.

Java

In Java JDKs erhältliche Müllsammler umfassen:

Gebrauchszeit

Die Müllkollektion für Kompilierung ist eine Form von Statische Analyse Ermöglichen, dass das Gedächtnis wiederverwendet und zurückgefordert wird, basierend auf Invarianten, die während der Zusammenstellung bekannt sind.

Diese Form der Müllsammlung wurde in der untersucht Quecksilberprogrammiersprache,[32] und es sah eine größere Verwendung bei der Einführung von Llvm's Automatischer Referenzzähler (ARC) in das Ökosystem von Apple (iOS und OS X) im Jahr 2011.[27][28][24]

Echtzeitsysteme

Zum Beispiel wurden inkrementelle, gleichzeitige und Echtzeit-Müllsammler entwickelt, beispielsweise nach Henry Baker und von Henry Lieberman.[33][34][35]

In Bakers Algorithmus erfolgt die Zuweisung in beiden Hälften eines einzelnen Speicherbereichs. Wenn es halb voll wird, wird eine Müllsammlung durchgeführt, die die Live -Objekte in die andere Hälfte bewegt und die verbleibenden Objekte implizit behandelt werden. Das laufende Programm (das 'Mutator') muss überprüfen, ob jedes Objekt, das es referenziert, in der richtigen Hälfte ist, und wenn sie es nicht übertragen, während eine Hintergrundaufgabe alle Objekte findet.[36]

Generation Müllsammlung Schemata basieren auf der empirischen Beobachtung, dass die meisten Objekte jung sterben. In Generationsmüllsammlung werden zwei oder mehr Zuordnungsregionen (Generationen) aufbewahrt, die basierend auf dem Alter des Objekts getrennt gehalten werden. Neue Objekte werden in der "jungen" Generation erstellt, die regelmäßig gesammelt wird, und wenn eine Generation voll ist, werden die Objekte, auf die immer noch aus älteren Regionen verwiesen werden, in die nächstälteste Generation kopiert. Gelegentlich wird ein vollständiger Scan durchgeführt.

Etwas hochrangige Sprachcomputerarchitekturen Fügen Sie Hardware-Support für die Echtzeit-Müllsammlung ein.

Die meisten Implementierungen von Echtzeit-Müllsammlern verwenden Verfolgung. Solche Echtzeit-Müllsammler treffen sich Harte Echtzeit Einschränkungen bei Verwendung mit einem Echtzeit-Betriebssystem.[37]

Siehe auch

Verweise

  1. ^ Abelson, Harold; Sussman, Gerald Jay; Sussman, Julie (2016). Struktur und Interpretation von Computerprogrammen (PDF) (2. Aufl.). Cambridge, Massachusetts, USA: MIT Press. S. 734–736.
  2. ^ McCarthy, John (1960). "Rekursive Funktionen symbolischer Ausdrücke und ihre Berechnung nach Maschine, Teil I". Kommunikation der ACM. 3 (4): 184–195. doi:10.1145/367177.367199. S2CID 1489409. Abgerufen 2009-05-29.
  3. ^ "Übersicht - D Programmiersprache". dlang.org. Digital Mars. Abgerufen 2014-07-29.
  4. ^ Zorn, Benjamin (1993-01-22). "Die gemessenen Kosten der konservativen Müllsammlung". Software: Übung und Erfahrung. Abteilung für Computerwissenschaften, Boulder der Universität von Colorado. 23 (7): 733–756. Citeseerx 10.1.1.14.1816. doi:10.1002/spe.4380230704. S2CID 16182444.
  5. ^ Hertz, Matthew; Berger, Emery D. (2005). "Quantifizierung der Leistung der Müllsammlung im Vergleich zum expliziten Speichermanagement" (PDF). Verfahren der 20. jährlichen ACM -Sigplan -Konferenz über objektorientierte Programmierung, Systeme, Sprachen und Anwendungen - OOPSLA '05. p. 313. doi:10.1145/1094811.1094836. ISBN 1-59593031-0. S2CID 6570650. Abgerufen 2015-03-15.
  6. ^ a b "Entwickler -Tools Kickoff - Sitzung 300" (PDF). WWDC 2011. Apple Inc. 2011-06-24. Abgerufen 2015-03-27.
  7. ^ "Referenzzählmüllsammlung".
  8. ^ "Referenz zählt". Erweiterung und Einbettung des Python -Dolmetschers. 2008-02-21. Abgerufen 2014-05-22.
  9. ^ Asche, Mike. "Freitag und A 2013-09-27: ARM64 und Sie". mikeash.com. Abgerufen 2014-04-27.
  10. ^ "Hamster Emporium: [OBJC Erklärung]: Nicht-Zeiger ISA". Sealiesoftware.com. 2013-09-24. Abgerufen 2014-04-27.
  11. ^ Pibinger, Roland (2005-05-03) [2005-04-17]. "Raii, dynamische Objekte und Fabriken in C ++".
  12. ^ a b Levanoni, Yossi; Petrank, Erez (2001). "Ein flatärer Referenzzählungsmüllsammler für Java". Verfahren der 16. ACM-Sigplan-Konferenz über objektorientierte Programmierung, Systeme, Sprachen und Anwendungen. Oopsla 2001. S. 367–380. doi:10.1145/504282.504309.
  13. ^ a b Levanoni, Yossi; Petrank, Erez (2006). "Ein flatärer Referenzzählungsmüllsammler für Java". ACM trans. Programm. Lang. System. 28: 31–69. Citeseerx 10.1.1.15.9106. doi:10.1145/1111596.1111597. S2CID 14777709.
  14. ^ Salagnac, Guillaume; Yovine, Sergio; Garbervetsky, Diego (2005-05-24). "Schnelle Escape-Analyse für die regionale Speicherverwaltung". Elektronische Notizen in theoretischer Informatik. 131: 99–110. doi:10.1016/j.entcs.2005.01.026.
  15. ^ Chisnall, David (2011-01-12). Einflussreiche Programmiersprachen, Teil 4: Lisp.
  16. ^ "PHP: Leistungsüberlegungen". php.net. Abgerufen 2015-01-14.
  17. ^ "Altair 8800 Basic 4.1 Referenzhandbuch" (PDF). Das digitale Archiv der Vintage Technology. April 1977. p. 108. Abgerufen 2021-06-29.
  18. ^ "Ich habe einige Arbeit geleistet, um die Müllsammlung von String Müll unter Apfelsoft zu beschleunigen ..." Hacker News. Abgerufen 2021-06-29.
  19. ^ Little, Gary B. (1985). Im Apple IIC. Bowie, Md.: Brady Communications Co. p. 82. ISBN 0-89303-564-5. Abgerufen 2021-06-29.
  20. ^ "Schnelle Müllsammlung". Call-A.P.P.L.E.: 40–45. Januar 1981.
  21. ^ Worth, Don (1984). Unter Apple Pro dos (PDF) (März 1985 Druck Ed.). Chatsworth, Kalifornien, USA: Qualitätssoftware. S. 2–6. ISBN 0-912985-05-4. Abgerufen 2021-06-29.
  22. ^ "Objective-C 2.0 Übersicht". Archiviert von das Original Am 2010-07-24.
  23. ^ Siracusa, John (2011-07-20). "Mac OS X 10.7 Löwe: Die ARS Technica Review".
  24. ^ a b "Apple sagt, dass Mac App -Hersteller bis Mai zum Bogenspeichermanagement übergehen müssen". Appleinsider. 2015-02-20.
  25. ^ Cichon, Waldemar (2015-02-21). "App Store: Apple Fnert Program MIT Müllsammlung". Heise.de. Abgerufen 2015-03-30.
  26. ^ Silva, Precious (2014-11-18). "iOS 8 gegen Android 5.0 Lollipop: Apple tötet Google mit Speichereffizienz". Internationale Business Times. Abgerufen 2015-04-07.
  27. ^ a b Napier, Rob; Kumar, Mugunth (2012-11-20). iOS 6 Programmierung drückt die Grenze. John Wiley & Sons. ISBN 978-1-11844997-4. Abgerufen 2015-03-30.
  28. ^ a b Cruz, José R. C. (2012-05-22). "Automatische Referenzzählung auf iOS". Dr. Dobbs. Abgerufen 2015-03-30.
  29. ^ Fu, Wei; Hauser, Carl (2005). "Ein Echtzeit-Müllsammlungsrahmen für eingebettete Systeme". Verfahren des Workshops 2005 zu Software und Compilern für eingebettete Systeme - Scopes '05. S. 20–26. doi:10.1145/1140389.1140392. ISBN 1-59593207-0. S2CID 8635481.
  30. ^ ".NET nanoframework".
  31. ^ Tene, Gil; Iyengar, Balaji; Wolf, Michael (2011). "C4: Der kontinuierlich gleichzeitige Kompaktkollektor" (PDF). ISMM '11: Verfahren des Internationalen Symposiums über das Gedächtnismanagement. doi:10.1145/1993478. ISBN 978-1-45030263-0.
  32. ^ Mazur, Nancy (Mai 2004). Müllsammung für Kompilierzeit für das deklarative Sprachquecksilber (PDF) (These). Katholieke Universität Leuven.
  33. ^ Huelsbergen, Lorenz; Winterbottom, Phil (1998). "Sehr gleichzeitige Marke-&-Müllsammlung ohne Feinkornsynchronisation durchführen." (PDF). Proceedings des ersten internationalen Symposiums über Gedächtnismanagement - ISMM '98. S. 166–175. doi:10.1145/286860.286878. ISBN 1-58113114-3. S2CID 14399427.
  34. ^ "GC FAQ".
  35. ^ Lieberman, Henry; Hewitt, Carl (1983). "Ein Echtzeit-Müllsammler basiert auf den Lebensdauern von Objekten". Kommunikation der ACM. 26 (6): 419–429. doi:10.1145/358141.358147. HDL:1721.1/6335. S2CID 14161480.
  36. ^ Baker, Henry G. (1978). "Listen Sie die Verarbeitung in Echtzeit auf einem seriellen Computer auf". Kommunikation der ACM. 21 (4): 280–294. doi:10.1145/359460.359470. HDL:1721.1/41976. S2CID 17661259. siehe auch Bezeichnung
  37. ^ McCloskey; Speck; Cheng; Grove (2008), Staccato: Ein paralleler und gleichzeitiger Echtzeit-Verfassungsmüllsammler für Multiprozessoren (PDF)

Weitere Lektüre

Externe Links