Mark – Compact GC &
Performancemessungen
Bernhard Prügl, 0156212
Inhalt
Motivation für Mark – Compact
Algorithmenüberblick
4 Algorithmen im Detail
Zusammenfassung Algorithmen
Performance der verschieden Garbage
Collection Strategien
Motivation für Mark – Compact
Lange Programmlaufzeit führt zu
Fragmentierung, welche folgende Probleme verursacht:
Aufwand zum Anlegen neuer Objekte steigt
Speicher wird nicht optimal ausgenützt
Nacheinander angelegte Objekte oft nicht nebeneinander
Mark-Compact reduziert diese Probleme
Algorithmenüberblick
Grundsätzliche 3 Phasen:
1. Markieren der lebendigen Knoten.
2. Kompaktierung des Speichers (Knoten verschieben).
3. Aktualisieren der Zeiger auf verschobene Knoten.
Kriterien anhand derer eine Einteilung möglich ist:
Einteilung nach Art wie verschobene Knoten angeordnet werden.
2 oder 3 Durchläufe zum Kompaktieren.
Einteilung nach zusätzlich benötigten Speicher
Weitere Anforderungen, z.B. nur Knoten gleicher Größe
Zwei Finger Algorithmus
2 Zeiger
"free" sucht freien Speicher
"live" sucht lebendige Knoten
"live" wird auf "free"
verschoben
Neue Adresse wird in
"live" hinterlassen
Lisp 2 Algorithmus (1/2)
Adressenweiterleitend
Zusätztliche
Speicherzelle im
Header jedes Knoten
"free" läuft von Anfang bis Ende
Neue Adresse wird in Header jedes Knoten geschrieben
Lisp 2 Algorithmus (2/2)
2.Durchlauf: interne Zeiger aktualisieren anhand der
Adresseinträge in den Headern
3.Durchlauf:
Knoten tatsächlich
verschieben
Haddon-Waite Algorithmus (1/2)
Tabellenbasiert
Zeiger durchläuft
Speicher von Anfang bis Ende
Knoten werden sofort verschoben
Information über Verschiebung in Tabelle eintragen
Haddon-Waite Algorithmus (2/2)
Tabelle am Ende des bearbeiteten Bereichs wird bei Bedarf
verschoben
Am Ende muss
Tabelle sortiert werden
2. Durchlauf: interne Zeiger mit Hilfe der Tabelle aktualisieren
Threading
Zeiger werden verbogen durch tauschen der Inhalte
P enthält eine Liste mit allen Zeigern die auf P zeigen
Info im letzten
Jonkers Algorithmus (1/2)
Threaded
Zuerst
vorwärtszeigende Zeiger threaden
Wird P erreicht
werden alle schon gethreadeden
Knoten aktualisiert
Jonkers Algorithmus (2/2)
Vorwärtszeigende
Zeiger zeigen jetzt auf zukünftiges P
Rückwärtszeigende Zeiger werden
gethreaded
2. Durchlauf: Knoten verschieben
Alle
rückwärtszeigenden Zeiger aktualisieren
Überblick
Geeigneter Algorithmus muss entsprechend
Vorgaben gewählt werden.
Performance
Performancemessungen in GC Bereich
Messungen auf AMD Athlon XP 2600+, ausgeführt von Stephen M Blackburn, 2004
3 Graphiken:
Laufzeitmessungen des gesamten Programms und der Garbage Collection allein
Cache Misses bei verschiedenen GC Strategien
Performance in Generationensystemen
Laufzeitmessungen
X-Achse: Heap Größe Y-Achse: Zeit
Cache Misses
Performance in
Generationensystemen
X-Achse: Speichergröße für neue Objekte