Static Wikipedia February 2008 (no images)

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - bcl - be - be_x_old - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - co - cr - crh - cs - csb - cu - cv - cy - da - de - diq - dsb - dv - dz - ee - el - eml - en - eo - es - et - eu - ext - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gan - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - hi - hif - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kaa - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mdf - mg - mh - mi - mk - ml - mn - mo - mr - mt - mus - my - myv - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - quality - rm - rmy - rn - ro - roa_rup - roa_tara - ru - rw - sa - sah - sc - scn - sco - sd - se - sg - sh - si - simple - sk - sl - sm - sn - so - sr - srn - ss - st - stq - su - sv - sw - szl - ta - te - tet - tg - th - ti - tk - tl - tlh - tn - to - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu

Web Analytics
Cookie Policy Terms and Conditions Automatische Speicherbereinigung - Wikipedia

Automatische Speicherbereinigung

aus Wikipedia, der freien Enzyklopädie

Automatische Speicherbereinigung oder Garbage-Collection (GC) (auch Freispeichersammlung) ist ein Fachbegriff aus der Softwaretechnik. Er steht für ein Verfahren zur regelmäßigen automatischen Wiederverfügbarmachung von nicht mehr benötigtem Speicher und anderen Betriebsmitteln, indem nicht mehr erreichbare Objekte im Speicher automatisch freigegeben werden. Das Wort Garbage-Collection kommt aus dem Englischen und heißt wörtlich übersetzt Müllabfuhr.

Inhaltsverzeichnis

[Bearbeiten] Funktionsweise

In vielen Softwaresystemen wird Speicherplatz bei Bedarf reserviert, um die Angaben zu einem Datenobjekt zu speichern. Wird nach Abarbeitung eines Programmteils das Objekt nicht mehr verwendet, so sollte der Platz für das Objekt auch wieder verfügbar gemacht werden. Diese Aufgabe erledigt eine Garbage-Collector genannte Routine automatisch, ohne dass dies explizit im Programm kodiert sein müsste. Darüberhinaus kann die automatische Speicherbereinigung in der Regel auch zu jedem Zeitpunkt in einem laufenden Programm aufgerufen werden.

[Bearbeiten] Konsequenzen

Eine automatische Speicherbereinigung verringert die Gefahr von Speicherlecks, kann sie aber – entgegen einer weit verbreiteten Ansicht – nicht völlig ausschließen: Wenn irgendwo noch Verweise auf eigentlich nicht mehr gebrauchte Objekte existieren, kann die automatische Speicherbereinigung diese nicht als unbenutzt erkennen. Dies passiert zum Beispiel genau dann, wenn durch systemnahe Programmierung das Laufzeitsystem umgangen und somit korrumpiert wird.

Eine automatische Speicherbereinigung kann unter Umständen auch die Ausführungsdauer von Programmläufen verringern, da sie eine Zusammenfassung der Freigabeoperationen bewirkt. Ferner kann eine automatische Speicherbereinigung Programme auch dadurch beschleunigen, dass die Speicherverwaltung des Systems entlastet wird.

Die Analyse und Freigabe von 10 Millionen Zeigern dauert auf modernen Rechenmaschinen mit effizienten Laufzeitsystemen nur Bruchteile einer Sekunde. Ein Nachteil, den die automatische Speicherbereinigung dennoch mit sich bringen kann, ist, dass der Zeitpunkt ihrer Durchführung unter Umständen nicht vorherzusehen ist. So ist es in Echtzeitsystemen wie zum Beispiel Eingebetteten Systemen nicht hinnehmbar, wenn die Programmausführung zu nicht voraussehbaren Zeitpunkten durch die Ausführung der automatischen Speicherbereinigung unterbrochen wird.

[Bearbeiten] Verbreitung

Einige ältere (APL, LISP, BASIC) und viele moderne Programmiersprachen verfügen über eine integrierte automatische Speicherbereinigung. Für Programmiersprachen wie C, bei denen die Programmierer die Speicherverwaltung „von Hand“ erledigen müssen, gibt es Bibliotheken, die eine automatische Speicherbereinigung zur Verfügung stellen.

[Bearbeiten] Algorithmen

Es gibt verschiedene Speicherbereinigungsalgorithmen, einige davon bekämpfen auch das Problem der Speicherfragmentierung.

[Bearbeiten] Mark-and-Sweep-Algorithmus

Bei diesem Verfahren der Speicherbereinigung wird von bekanntermaßen noch benutzten Objekten ausgehend allen Verweisen auf andere Objekte gefolgt. Jedes so erreichte Objekt wird markiert. Anschließend werden alle nicht markierten Objekte zur Wiederverwendung freigegeben.

Die Freigabe kann zur Speicherfragmentierung führen. Das Problem ist hierbei jedoch etwas geringer als bei manueller Speicherverwaltung. Während bei manueller Speicherverwaltung die Dislozierung immer sofort erfolgt, werden bei Mark-and-Sweep fast immer mehrere Objekte auf einmal beseitigt, wodurch größere zusammenhängende Speicherbereiche frei werden können.

[Bearbeiten] Mark-and-Compact-Algorithmus

Der Mark-and-Compact-Algorithmus benutzt ebenso wie Mark-and-Sweep das Prinzip der Erreichbarkeit in Graphen, um noch referenzierte Objekte zu erkennen. Diese kopiert er an eine andere Stelle im Speicher. Der ganze Bereich, aus dem die noch referenzierten (man spricht hier auch von „lebenden“) Objekte herauskopiert wurden, wird nun als freier Speicherbereich betrachtet.

Nachteil dieser Methode ist das Verschieben der „lebenden“ Objekte selber, denn Zeiger auf diese werden ungültig und müssen angepasst werden. Meistens wird dies erreicht, indem ein Objekt über zwei Indirektionen (Umleitungen) angesprochen wird: über einen Zeiger auf einen Zeiger auf das Objekt. Beim Verschieben des Objekts muss nun nur noch der Zeiger, der direkt auf das Objekt zeigt, angepasst werden. In früheren Versionen von Java wurden solche „Zeiger auf Zeiger“ verwendet.

Das Verschieben der Objekte hat allerdings den Vorteil, dass jene, die die Bereinigung „überlebt“ haben, nun alle kompaktiert zusammenliegen und der Speicher damit praktisch defragmentiert ist. Auch ist es möglich, sehr schnell zu allozieren, weil freier Speicherplatz nicht aufwändig gesucht wird. Anschaulich: Werden die referenzierten Objekte an den „Anfang“ des Speichers verschoben, kann neuer Speicher einfach am „Ende,“ hinter dem letzten lebenden Objekt, alloziert werden. Das Allozieren funktioniert damit vergleichsweise einfach, ähnlich wie beim Stack.

[Bearbeiten] Referenzzählung

Bei diesem Verfahren führt jedes Objekt einen Zähler mit der Anzahl aller Referenzen, die auf dieses Objekt zeigen. Fällt der Referenzzähler eines Objektes auf null, so kann es freigegeben werden.

Ein besonderes Problem der Freispeichersammlung mit Referenzzählung liegt in so genannten zyklischen Referenzen, bei denen Objekte Referenzen aufeinander halten, aber sonst von keinem Konsumenten im System mehr verwendet werden. Nehmen wir beispielsweise an, Objekt A halte eine Referenz auf Objekt B und umgekehrt, während der Rest des Systems ihre Dienste nicht mehr benötigt. Somit verweisen beide Objekte gegenseitig (zyklisch) aufeinander, weshalb die automatische Speicherbereinigung nicht ohne weiteres erkennen kann, dass sie nicht mehr benutzt werden. Die Folge hiervon ist, dass der Speicher somit für die Dauer der Programmausführung belegt bleibt. Es gibt unterschiedliche Algorithmen, die solche Situationen erkennen und auflösen können, zumeist nach dem Prinzip der Erreichbarkeit in Graphen.

[Bearbeiten] Konservative und nicht-konservative Speicherbereinigung

Unter einer konservativen automatischen Speicherbereinigung versteht man eine, die nicht zuverlässig alle nicht-referenzierten Objekte erkennen kann. Diese hat meistens keine Informationen darüber, wo sich im Speicher Referenzen auf andere Objekte befinden.

Während einem nicht-konservativem Kollektor (manchmal auch als „exakter Kollektor“ bezeichnet) Metadaten vorliegen, anhand derer er alle Referenzen innerhalb von Objekten und Stackframes auffinden kann, muss ein konservativer den Speicher auf mögliche Referenzen durchsuchen. Jede Bitfolge, die eine gültige Referenz in den Speicher sein könnte, wird als Referenz angenommen. Es kann dabei nicht festgestellt werden, ob es sich dabei nicht doch um ein Zufallsmuster handelt. Daher erkennen konservative Kollektoren gelegentlich Objekte als referenziert, obwohl sie es eigentlich nicht sind. Da eine automatische Speicherbereinigung niemals Objekte entfernen darf, die noch gebraucht werden könnten, muss sie konservativ annehmen, dass es sich bei der erkannten Bitfolge um eine Referenz handelt.

Insbesondere wenn eine automatische Speicherbereinigung auch dringlichere Ressourcen als Speicher freigeben muss (siehe Finalisierung), kann ein konservativer Kollektor ein Risiko darstellen. Im Allgemeinen findet man konservative GCs dort, wo eine Implementierung der automatischen Speicherverwaltung schwierig ist, zum Beispiel für die Sprachen C++ und C. (Anmerkung: Dies gilt nicht für die „verwalteten Typen“ in C++/CLI, da dort eigene Referenztypen für die automatische Speicherbereinigung eingeführt wurden, die es nicht erlauben, direkt die Adresse eines Objekts auszulesen.)

[Bearbeiten] Finalisierung

Die in vielen Systemen verbreitete Technik, Objekte mit Hilfe der automatische Speicherbereinigung zu deinitialisieren, bezeichnet man auch als Finalisierung. Beispielsweise verfügen Objekte in der Programmiersprache Java über eine spezielle Methode namens finalize, die für eben diese Zwecke verwendet wird.

Dieses Verfahren, also Objekt-Deinitialisierungen von der automatische Speicherbereinigung erledigen zu lassen, wird mittlerweile als Design-Fehler betrachtet und in neueren Architekturen vermieden.

Probleme, die sich durch Finalisierung ergeben, sind:

  • Objekte, die eine Finalisierung benötigen, haben eine längere Lebensdauer als andere. Diese Lebensdauer kann sogar deutlich über der von Objekten ohne Finalisierung liegen. Werden knappe Ressourcen damit verwaltet, dann kann dies zu blockierenden Zuständen innerhalb des Programmablaufs führen.
  • Finalisierung erzeugt zusätzliche Rechenlast für die automatische Speicherbereinigung.
  • Es gibt keine definierte Finalisierungsreihenfolge. Daher kann es geschehen, dass während der Finalisierung auf andere Objekte zugegriffen wird, die ebenfalls der Finalisierung unterworfen sind, zu diesem Zeitpunkt aber überhaupt nicht mehr existieren.
  • Es gibt je nach Implementierung (z. B. in der Programmiersprache Java) keine Garantie dafür, dass die Finalisierungsroutine von der automatischen Speicherbereinigung überhaupt aufgerufen wird.

Aus diesen Gründen versucht man neuerdings, komplett auf Finalisierung zu verzichten. Die Verwaltung anderer Betriebsmittel als Speicher hält man von der automatische Speicherbereinigung fern. Der automatischen Speicherbereinigung fällt dann also ausschließlich die Aufgabe der Speicherverwaltung zu.

[Bearbeiten] Fragmentierung

Traditionelle Speicherverwaltungen neigen im Laufe der Zeit zur Fragmentierung. Verursacht wird dieses Problem durch die unterschiedliche Lebenszeit von Objekten. Die Speicherverwaltung führt Buch darüber, welche Stellen „freien Speicher“ repräsentieren, also alloziert werden können und welche bereits von Objekten belegt sind. Durch das explizite Freigeben von Speicherstellen entstehen Lücken, die nicht immer sofort wieder aufgefüllt werden können. Wenn neue Objekte größer sind als die freigewordenen Lücken, muss an anderer Stelle ein nicht allozierter Bereich gesucht werden.

Probleme, die bei Fragmentierung auftreten können:

  • Es bleibt ein gewisser Teil des zur Verfügung stehenden Speichers ungenutzt.
  • Das Allozieren von Speicher dauert länger, wenn die Datenstrukturen, über die der Heap verwaltet wird, komplexer werden. Das Suchen nach einer freien Speicherstelle von passender Größe gestaltet sich aufwändiger.
  • Es kommt immer wieder vor, dass nacheinander allozierte Objekte nicht nebeneinander im Speicher stehen (man spricht hierbei von schlechter Speicherlokalität). Untersuchungen haben gezeigt, dass nacheinander erzeugte Objekte oft gleichzeitig für eine bestimmte Operation gebraucht werden. Wenn sie nicht nahe genug beieinander liegen, werden Zugriffe anstatt auf den schnellen Cache-Speicher auf den dahinterliegenden, langsameren Speicher umgeleitet, was den Zugriff stark bremsen kann.

[Bearbeiten] Siehe auch

Speicherverwaltung, Destruktor

[Bearbeiten] Literatur

  • Richard Jones, Rafael Lins: Garbage Collection. John Wiley and Sons Ltd, 30. April 1996, ISBN 0471941484

[Bearbeiten] Weblinks

Static Wikipedia 2008 (no images)

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - bcl - be - be_x_old - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - co - cr - crh - cs - csb - cu - cv - cy - da - de - diq - dsb - dv - dz - ee - el - eml - en - eo - es - et - eu - ext - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gan - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - hi - hif - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kaa - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mdf - mg - mh - mi - mk - ml - mn - mo - mr - mt - mus - my - myv - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - quality - rm - rmy - rn - ro - roa_rup - roa_tara - ru - rw - sa - sah - sc - scn - sco - sd - se - sg - sh - si - simple - sk - sl - sm - sn - so - sr - srn - ss - st - stq - su - sv - sw - szl - ta - te - tet - tg - th - ti - tk - tl - tlh - tn - to - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu -

Static Wikipedia 2007 (no images)

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - bcl - be - be_x_old - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - co - cr - crh - cs - csb - cu - cv - cy - da - de - diq - dsb - dv - dz - ee - el - eml - en - eo - es - et - eu - ext - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gan - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - hi - hif - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kaa - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mdf - mg - mh - mi - mk - ml - mn - mo - mr - mt - mus - my - myv - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - quality - rm - rmy - rn - ro - roa_rup - roa_tara - ru - rw - sa - sah - sc - scn - sco - sd - se - sg - sh - si - simple - sk - sl - sm - sn - so - sr - srn - ss - st - stq - su - sv - sw - szl - ta - te - tet - tg - th - ti - tk - tl - tlh - tn - to - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu -

Static Wikipedia 2006 (no images)

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - bcl - be - be_x_old - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - co - cr - crh - cs - csb - cu - cv - cy - da - de - diq - dsb - dv - dz - ee - el - eml - eo - es - et - eu - ext - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gan - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - hi - hif - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kaa - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mdf - mg - mh - mi - mk - ml - mn - mo - mr - mt - mus - my - myv - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - quality - rm - rmy - rn - ro - roa_rup - roa_tara - ru - rw - sa - sah - sc - scn - sco - sd - se - sg - sh - si - simple - sk - sl - sm - sn - so - sr - srn - ss - st - stq - su - sv - sw - szl - ta - te - tet - tg - th - ti - tk - tl - tlh - tn - to - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu