Garbage Collection
 
StartSeite | Neues | TestSeite | ForumSeite | Teilnehmer | Kategorien | Index | Hilfe | Einstellungen | Ändern

(engl. Abk: "GC") Fortgeschrittenes System zur Automatisierung der dynamischen SpeicherVerwaltung (Was man in C mittels malloc/free per Hand tun muss).

Eine auf deutsch verfasste Einführung: http://www.ssw.uni-linz.ac.at/Teaching/Lectures/Sem/2003/reports/Kusel/Kusel.pdf

Algorithmen zur GarbageCollection

Es gibt viele Algorithmen zur Implementierung von GarbageCollection, die alle ihre Vor- und Nachteile haben und die unterschiedlich komplex sind.

Tracing GC vs ReferenzZählung' Streng genommen gehört ReferenzZählung als Gegenstück zur "Tracing GC" (Verfolgenden GC) auch zur GarbageCollection, üblicherweise aber trennt man es strikt, und meint mit GC nur die "Tracing GC".

Konservative GC: Objekte müssen nur wissen wie groß sie sind, aber nicht ob sie Zeiger oder Daten beinhalten. Die Objekte werden nicht kopiert, also müssen keine Zeiger angepaßt werden. Der üblichste Algorithmus ist Mark and Sweep. Wenn das System keinerlei Unterstützung über den Datentyp in Objekten beinhaltet (Zeiger oder nicht), können einige Objekte uU. von der Freigabe ausgeschlossen sein, obwohl sie nicht mehr referenziert werden. "Black-listing" kann das umgehen. ( http://www.xanalys.com/software_tools/mm/glossary/b.html#blacklisting) Der Böhm GC ist der meistverwendete, vor allen mit primitiven Sprachen wie C++.

Kopierende GC: "Stop & Copy" verursacht die berühmten Pausen, ist aber relativ leicht zu implementieren und hält den Hauptspeicher kompakt. Kopierende GC sind "kompaktierend", dh. sie verursachen keine Löcher wie bei Mark-Sweep, malloc oder ReferenzZählung.

Verteilte GC: Wird in Systemen mit nicht durchgehenden Hauptspeicher Segmenten verwendet, zB. in verschiedenen Threads, privaten CPU-Heaps oder verschiedenen Maschinen. Auf WAN-System ist der Verwaltungsaufwand zur Synchronisation und Kommunikation sehr hoch, daher wird statt Tracing GC, üblicherweise "gewichtete ReferenzZählung" eingesetzt. (In DCOM nur ungewichtete ReferenzZählung). http://www.xanalys.com/software_tools/mm/glossary/w.html#weighted.reference.counting

Generationelle GC: Ein GC mit Trennung in verschiedene Altersklassen der Objekte, der sehr gut durch moderne CPU-Caches und moderne Sprachen unterstützt wird. Diese GC's sind üblicherweise die schnellsten. http://www.xanalys.com/software_tools/mm/glossary/g.html#generational.garbage.collection

Inkrementelle GC: Einfache GC's können in ihrer Ausführung nicht unterbrochen werden. Inkrementelle GC können durch Pausen unterbrochen werden, ohne inkonsistente Daten zu hinterlassen. Dadurch sind sie für Echtzeit- und hoch interaktive Anwendungen geeignet. http://www.xanalys.com/software_tools/mm/glossary/i.html#incremental.garbage.collection

Parallelle GC: Ein GC für Multiprozessorsysteme, der ähnlich aber schwieriger als ein inkrementeller GC ist, implementiert mit Hilfe von "Barriers" (Software oder Hardware Unterstützung bei LOAD und STORE ops). http://www.xanalys.com/software_tools/mm/glossary/p.html#parallel.garbage.collection


Vorteile: Nachteile: Beachte, das automatische SpeicherVerwaltung auch ReferenzZählung sein kann. Bekannte Beispiele sind Perl und COM. Siehe auch http://www.xanalys.com/software_tools/mm/faq.html Moderne GC (incremental generational oder RealTime? GC's) sind ungleich besser als manuelle SpeicherVerwaltung. --ReiniUrban

Vergleich ReferenzZählung - GarbageCollection:

Der Vergleich zu malloc schaut ähnlich aus. Allokierung geht mit GC ungleich schneller als mit malloc, free ist etwa schneller als GC, aber Generationelle GC's gleichen das aus.

Außerdem, wer verwendet schon den C alloca? In guten Lisp's, ML's oder scheme passiert das automatisch, da der Compiler mehr weiß und Funktionsaufrufe besser optimieren kann. (-> automatische SpeicherVerwaltung)


Links:

Siehe auch:

GC in Java

GC in Smalltalk

Die oben genannten Techniken werden kombiniert. Der GC von VisualWorks besteht z. B. aus einem sog. Generation Scavenger, einem Incrementellen GC und einem Kompaktifizierer. Außerdem kann auch die Objektbasis für den Suchalgorithmus bereinigt werden (globaler GC für den Permanentspeicher), was ein Standardschritt beim Deployment ist. Will man C-Routinen ansprechen, sind wieder andere Mechanismen wie z. B. explizite Heap-Kopie oder Schutz vor dem GC erforderlich.

Vor Speicherzugriffsfehlern der VM braucht man kaum Angst zu haben. Problematischer wird's bei der Parametriesierung des GC. Anwendungen mit speziellen Anforderungen an den GC müssen adäquate Werte setzen oder eine Unterklasse der Standard-Memory-Policy schreiben.

Auf den Seiten von Cincom gibt es hochinteressante aber mitunter leider schwer zu findende Dokumente über das Memory-Management von VisualWorks. Einen ersten Überblick gibt

   http://www.cincomsmalltalk.com/CincomSmalltalkWiki/DOWNLOAD/DOCS/memory-VW3.x.pdf


KategorieProgrammierSprachenKonzepte KategorieResourcen KategorieJargon
StartSeite | Neues | TestSeite | ForumSeite | Teilnehmer | Kategorien | Index | Hilfe | Einstellungen | Ändern
Text dieser Seite ändern (zuletzt geändert: 29. Mai 2006 9:39 (diff))
Suchbegriff: gesucht wird
im Titel
im Text