Technopedia Center
PMB University Brochure
Faculty of Engineering and Computer Science
S1 Informatics S1 Information Systems S1 Information Technology S1 Computer Engineering S1 Electrical Engineering S1 Civil Engineering

faculty of Economics and Business
S1 Management S1 Accountancy

Faculty of Letters and Educational Sciences
S1 English literature S1 English language education S1 Mathematics education S1 Sports Education
  • Registerasi
  • Brosur UTI
  • Kip Scholarship Information
  • Performance
  1. WeltenzyklopÀdie
  2. Garbage Collection
Garbage Collection 👆 Click Here!
aus Wikipedia, der freien EnzyklopÀdie
(Weitergeleitet von Garbage Collector)
Animation einer automatischen Speicherbereinigung. Der Speicherbereich wird mit verschiedenen Objekten (mit Farben dargestellt) gefĂŒllt, von denen einige auch wieder zerstört werden und LĂŒcken im Speicherbereich hinterlassen. Wenn (wie in diesem Beispiel) nicht mehr genug freier Speicherplatz „am Ende“ verfĂŒgbar ist oder wenn die automatische Speicherbereinigung entscheidet, wird der Speicher „komprimiert“, wobei alle noch verwendeten Objekte an den Beginn platziert und am Ende alle SpeicherlĂŒcken konsolidiert werden. Dadurch wird wieder ein großer Speicherbereich fĂŒr die zukĂŒnftige Erstellung von Objekten verfĂŒgbar.

Die Garbage Collection, kurz GC (englisch fĂŒr MĂŒllabfuhr, auch automatische Speicherbereinigung oder Freispeichersammlung genannt) bezeichnet in der Software- und Informationstechnik eine automatische Speicherverwaltung, die zur Vermeidung von Speicherproblemen beitrĂ€gt; der Vorteil wird mit einem erhöhten Ressourcenverbrauch erkauft. Unter anderem wird der Speicherbedarf eines Computerprogramms minimiert. Dabei wird zur Laufzeit versucht, nicht lĂ€nger benötigte Speicherbereiche automatisch zu identifizieren, um diese dann freizugeben. Manche automatischen Speicherbereinigungen fĂŒhren darĂŒber hinaus die noch verwendeten Speicherbereiche zusammen (Defragmentierung).

Motivation

[Bearbeiten | Quelltext bearbeiten]

In vielen Softwaresystemen wird benötigter (Arbeits-)Speicher dynamisch (bei Bedarf) reserviert. Wird er nach Abarbeitung eines Programmteils nicht weiter verwendet, so sollte der Speicher wieder freigegeben werden, um eine Wiederverwendung dieser Ressource zu ermöglichen. Bei einer expliziten, manuellen Speicherverwaltung geschieht dies durch Festlegen der Speicherreservierung und -freigabe im Programm durch den Programmierer, ein schnell komplex und damit potenziell fehlertrĂ€chtig werdendes Vorgehen. Neben dem Vergessen einer Freigabe, das lĂ€ngerfristig zu Speicherknappheit fĂŒhren kann, fĂŒhrt das zu frĂŒhe Freigeben von (anderswo) noch benötigtem Speicher meist schnell zum Programmabsturz. Vergessene Speicherfreigaben fĂŒhren oft nicht sofort zu AuffĂ€lligkeiten im Programmablauf – zumindest nicht wĂ€hrend der typischerweise nur kurzen ProgrammlĂ€ufe wĂ€hrend der Entwicklung, sondern erst, wenn das fertige Programm vom Endanwender oft ĂŒber Stunden und Tage ununterbrochen betrieben wird.

Bei manueller Speicherverwaltung ist es oft nicht möglich oder sehr aufwendig, den Speicher zu defragmentieren. Stark fragmentierter Speicher kann dazu fĂŒhren, dass eine Speicherreservierung des Programms fehlschlĂ€gt, da kein ausreichend großer zusammenhĂ€ngender Bereich verfĂŒgbar ist.

Beschreibung

[Bearbeiten | Quelltext bearbeiten]

Bei der automatischen Speicherbereinigung ist die Idee, diese Aufgabe durch eine Garbage Collector genannte Routine automatisch erledigen zu lassen, ohne Zutun des Programmierers. D. h. das Speichermanagement wird von einer expliziten Festlegung zur Programmerstellungszeit (Compile-Zeit) zu einer dynamischen Analyse des Speicherbedarfs zur Laufzeit des Programms verschoben.

Üblicherweise lĂ€uft eine solche automatische Speicherbereinigung im Hintergrund (bzw. nebenlĂ€ufig) in mehr oder minder regelmĂ€ĂŸigen ZeitabstĂ€nden (z. B. wĂ€hrend Pausen im Programmablauf) und wird nicht explizit durch das Programm ausgelöst. GC kann jedoch hĂ€ufig auch zusĂ€tzlich direkt ausgelöst werden, um dem Programm etwas Kontrolle ĂŒber die Bereinigung zu geben, z. B. in einer Situation von Speichermangel (Out-Of-Memory).

AnsÀtze

[Bearbeiten | Quelltext bearbeiten]

Es gibt verschiedene AnsĂ€tze, um eine automatische Speicherbereinigung zu implementieren. GewĂŒnschte Anforderungen können ein möglichst geringer Speicherverschnitt, eine maximale Allozierungsgeschwindigkeit, eine Reduktion der Speicherfragmentierung und viele weitere mehr sein, die sich durchaus auch widersprechen und zu Zielkonflikten fĂŒhren können. D. h. je nach Anwendungsfall kann eine automatische Speicherbereinigung sehr unterschiedlich aussehen und sicher viele Anforderungen erfĂŒllen, manche aber auch nicht.

Typischerweise werden jedoch alle diese Varianten zwei Grundtypen von Speicherbereinigungen zugeordnet: Konservative und nicht-konservative Speicherbereinigung.

Konservative automatische Speicherbereinigung

[Bearbeiten | Quelltext bearbeiten]

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. Zur Speicherbereinigung muss sie 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 interne Pointer (also Pointer auf unterschiedliche Teile eines Objektes) erlaubt sind, was eine Implementierung der automatischen Speicherverwaltung erschwert. Beispiele dafĂŒr sind die Sprachen C und C++. Hier sei anzumerken, dass dies nicht fĂŒr die verwalteten Typen in C++/CLI gilt, da dort eigene Referenztypen fĂŒr die automatische Speicherbereinigung eingefĂŒhrt wurden, die es nicht erlauben, direkt die Adresse eines Objekts auszulesen.

Nicht-konservative automatische Speicherbereinigung

[Bearbeiten | Quelltext bearbeiten]

Unter einer nicht-konservativen automatischen Speicherbereinigung (manchmal auch als exakte Speicherbereinigung bezeichnet) versteht man eine, der Metadaten vorliegen, anhand derer sie alle Referenzen innerhalb von Objekten und Stackframes auffinden kann. Bei nicht-konservativer Speicherbereinigung wird zwischen Verfolgung (tracing garbage collectors) und ReferenzzÀhlung unterschieden.

Verfolgende Algorithmen

[Bearbeiten | Quelltext bearbeiten]
Mark-and-Sweep-Algorithmus
[Bearbeiten | Quelltext bearbeiten]

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 Deallozierung 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.

Mark-and-Compact-Algorithmus
[Bearbeiten | Quelltext bearbeiten]

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. Hierzu gibt es grundsĂ€tzlich wenigstens zwei Verfahren:

  1. Jedes Objekt wird ĂŒber zwei Indirektionen (Umleitungen) angesprochen (ĂŒber einen Zeiger auf einen Zeiger auf das Objekt), so dass beim Verschieben nur noch der Zeiger, der direkt auf das Objekt zeigt, angepasst werden muss.
  2. Alle Referenzen verweisen direkt auf das Objekt, um aufwÀndige Dereferenzierungen zu vermeiden, und werden nach einer Verschiebung geeignet angepasst.

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.

Generationell
[Bearbeiten | Quelltext bearbeiten]

Generationelle GCs verkĂŒrzen die Laufzeit der Speicherfreigabe. Dazu wird die Situation ausgenutzt, dass in der Praxis die Lebensdauer von Objekten meist sehr unterschiedlich ist: Auf der einen Seite existieren Objekte, die die gesamte Laufzeit der Applikation ĂŒberleben. Auf der anderen Seite gibt es eine große Menge von Objekten, die nur temporĂ€r fĂŒr die DurchfĂŒhrung einer einzelnen Aufgabe benötigt werden. Der Speicher wird bei generationellen GCs in mehrere Teilbereiche (Generationen) aufgeteilt. Die Langlebigkeit wird durch einen ZĂ€hler quantifiziert, welcher bei jeder Garbage-Collection inkrementiert wird. Mit jeder Anwendung des Freigabe-Algorithmus (zum Beispiel Mark-and-Compact oder Stop-And-Copy) werden langlebige Objekte in eine höhere Generation verschoben. Der Vorteil liegt darin, dass die Speicherbereinigung fĂŒr niedrige Generationen hĂ€ufiger und schneller durchgefĂŒhrt werden kann, da nur ein Teil der Objekte verschoben und deren Zeiger verĂ€ndert werden mĂŒssen. Höhere Generationen enthalten mit hoher Wahrscheinlichkeit nur lebende (bzw. sehr wenige tote) Objekte und mĂŒssen deshalb seltener bereinigt werden.

GC Generationen in Java HotSpot

Die Anzahl der Generationen wird heuristisch festgelegt (zum Beispiel drei in .NET, zwei fĂŒr junge Objekte (auch Young-Generation genannt) und einer fĂŒr alte Objekte (Tenured-Generation) in der Java-VM von Sun). Zudem können fĂŒr jede Generation unterschiedliche Algorithmen verwendet werden. In Java beispielsweise wird fĂŒr die niedrigste Generation ein modifizierter Stop-And-Copy-Algorithmus angewandt, fĂŒr die höhere Mark-And-Compact.

ReferenzzÀhlung

[Bearbeiten | Quelltext bearbeiten]
→ Hauptartikel: 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.

Eigenschaften

[Bearbeiten | Quelltext bearbeiten]

Mit einer Garbage Collection können einige hĂ€ufig auftretende Programmierfehler, die beim Umgang mit dynamischer Speicherverwaltung oft gemacht werden, ganz oder zumindest teilweise vermieden werden. Besonders zu erwĂ€hnen sind hierbei Speicherlecks, die doppelte Freigabe von Ressourcen und die Dereferenzierung von versehentlich zu frĂŒh freigegebenen Ressourcen (HĂ€ngende Zeiger). Eine Freigabe noch referenzierter Objekte fĂŒhrt zu hĂ€ngenden Zeigern, welche oft zu ProgrammabstĂŒrzen und undeterministischem Verhalten fĂŒhren.

Als Folge des Satzes von Rice kann nicht festgestellt werden, ob noch referenzierte Objekte jemals wieder benutzt werden. Darum gibt eine automatische Speicherbereinigung nur vom Programm nicht mehr referenzierte Objekte frei; sie verhindert keine „Speicherlecks“ der Sorte, dass das Programm auf den Speicherbereich noch eine Referenz hĂ€lt, den Inhalt jedoch nie wieder nutzt.[1][2][3] Derartige Speicherlecks stellen normalerweise Logische Fehler oder Designfehler (Fehler im Grundkonzept, falsche Anforderungen an die Software, Softwaredesign-Fehler) dar und können auch bei nicht-automatischer Speicherverwaltung entstehen.

ZusĂ€tzlich behebt Garbage Collection das Problem der Speicherfragmentierung, das kein Programmierfehler im eigentlichen Sinne ist, jedoch auf ungĂŒnstigem Programmdesign basieren kann. Dieses Problem kann zu nur schwer reproduzierbaren ProgrammabstĂŒrzen fĂŒhren. Das Problem der Speicherfragmentierung wird von explizitem/manuellem Speichermanagement im Allgemeinen nicht gelöst.

LeistungsfÀhigkeit

[Bearbeiten | Quelltext bearbeiten]

Ob eine automatische Speicherbereinigung Programme insgesamt beschleunigt oder ausbremst, ist umstritten. In einigen Kontexten, wie z. B. wenn Speicher erst dann freigegeben wird, wenn die Systemanforderungen gerade niedrig sind oder wenn die Speicherverwaltung des Systems durch Defragmentierung entlastet wird, kann sie zu Leistungssteigerungen fĂŒhren. Es existieren Microbenchmarks, welche belegen, dass bei Programmiersprachen mit automatischer Speicherbereinigung die Anlage/Freigabe von Objekten in Summe schneller vonstattengeht als ohne,[4][5] jedoch auch Microbenchmarks, die insgesamt einen ĂŒberwiegend negativen Einfluss auf die LeistungsfĂ€higkeit sehen.[6] Eine Veröffentlichung von 2005 gibt an, dass die LeistungsfĂ€higkeit von Garbage Collection nur dann gleich gut wie oder leicht besser als beim expliziten Speichermanagement sei, wenn der Garbage Collection fĂŒnfmal so viel Speicher zusteht, wie tatsĂ€chlich benötigt wird. Bei dreimal so viel Speicher liefe Garbage Collection im Schnitt 17 % langsamer, bei doppelt so viel Speicher 70 % langsamer als bei explizitem Speichermanagement.[7]

Speicherverbrauch

[Bearbeiten | Quelltext bearbeiten]

Beim Speicherverbrauch fĂŒhrt eine automatische Speicherverwaltung und -bereinigung zu einem Overhead gegenĂŒber einem expliziten, hĂ€ndischen Speichermanagement aufgrund der zeitverzögerten Bereinigung. Eine wissenschaftliche Veröffentlichung von 1993 schĂ€tzt den Overhead bei konservativer Speicherbereinigung (wie beispielsweise fĂŒr die Sprache C erhĂ€ltlich) auf typischerweise 30–150 %.[8] Andererseits ist eine korrekte Implementierung manueller Speicherfreigabe in nicht trivialen Programmen komplex umzusetzen, was Fehlerquellen fĂŒr Speicherlecks bei manueller Speicherfreigabe schafft. Beispielsweise kann die oft angewandte Methode der ReferenzzĂ€hlung keine zyklischen Referenzen erkennen und fĂŒhrt ohne ErgĂ€nzung durch komplexe Algorithmen zu Speicherlecks.

Determinismus

[Bearbeiten | Quelltext bearbeiten]

Indem der Programmierer die Entscheidung ĂŒber den Freigabezeitpunkt nicht explizit festlegt, gibt er auch einen Teil der Kontrolle ĂŒber den Programmfluss auf. Da die automatische Speicherbereinigung i. d. R. nebenlĂ€ufig stattfindet, hat das Programm selbst keine Information darĂŒber, wann Speicherbereiche wirklich freigegeben bzw. Objekte finalisiert werden. Dadurch ist der Programmfluss potentiell nicht mehr deterministisch.[9]

Konkret können folgende Formen nicht-deterministischen Verhaltens auftreten:

  • Der Zeitpunkt der Finalisierung ist unbestimmt: Selbst wenn ein Objekt als nicht mehr benötigt erkannt und zur Bereinigung ausgewĂ€hlt wurde, ist der Zeitpunkt der Finalisierung unbestimmt, dadurch ist auch der Programmfluss nicht mehr deterministisch. Das ist insbesondere dann ein Problem, wenn das Objekt gemeinsam genutzte Ressourcen verwendet oder abschließende Berechnungen durchfĂŒhrt. Derartiges im Zuge der Finalisierung zu machen gilt in der Programmierung als Anti-Pattern.
  • Die Laufzeit – sowohl des gesamten Programms als auch nur von einzelnen Abschnitten – kann durch die Unterbrechungen durch den Garbage Collector nicht-deterministisch werden. Das stellt speziell fĂŒr Echtzeitsysteme ein Problem dar. So ist es in Echtzeitsystemen nicht hinnehmbar, dass die ProgrammausfĂŒhrung zu unvoraussehbaren Zeitpunkten durch die AusfĂŒhrung der Speicherbereinigung unterbrochen wird. FĂŒr Echtzeitsysteme arbeitet, wie beispielsweise bei Real-Time Java, eine automatische Speicherbereinigung prĂ€emptiv (zum Beispiel im Leerlaufprozess) und inkrementell. Einfache inkrementelle Verfahren arbeiten zum Beispiel mit der sogenannten Dreifarb-Markierung.[10]

Defragmentierung

[Bearbeiten | Quelltext bearbeiten]

Mittels kompaktierender Algorithmen kann Garbage Collection eine Fragmentierung des Speichers verhindern. Siehe dazu Mark and Compact. Damit werden LĂŒcken im Speicher vermieden, die aufgrund zu großer neuer Objekte nicht aufgefĂŒllt werden könnten. Defragmentierung fĂŒhrt zwar zu einer lĂ€ngeren Verzögerung beim Freigeben von Speicher, reduziert allerdings die Allozierungsdauer. Um die Speicherfreigabe möglichst schnell durchfĂŒhren zu können, wird darauf geachtet, dass möglichst selten große Speicherbereiche aufgerĂ€umt werden mĂŒssen. Deshalb werden diese Algorithmen bevorzugt in Kombination mit generationellen Verfahren eingesetzt.

Defragmentierung des Speichers fĂŒhrt zu folgenden Vorteilen:

  • Es wird der gesamte zur VerfĂŒgung stehende Speicher genutzt.
  • Das Allozieren von Speicher dauert kĂŒrzer, da die Datenstrukturen, ĂŒber die der Heap verwaltet wird, weniger komplex werden. Das Suchen nach einer freien Speicherstelle von passender GrĂ¶ĂŸe gestaltet sich einfacher.
  • Nacheinander allozierte Objekte stehen meist nebeneinander im Speicher (man spricht hierbei von guter SpeicherlokalitĂ€t). Untersuchungen haben gezeigt, dass nacheinander erzeugte Objekte oft gleichzeitig fĂŒr eine bestimmte Operation gebraucht werden. Wenn sie nahe genug beieinander liegen, erfolgen die Zugriffe auf den schnellen Cache-Speicher und nicht auf den dahinterliegenden, langsameren Speicher.

Finalisierung

[Bearbeiten | Quelltext bearbeiten]

Als Finalisierung (englisch finalization) bezeichnet man in objekt-orientierten Programmiersprachen eine spezielle Methode, die aufgerufen wird, wenn ein Objekt durch den Garbage Collector freigegeben wird.

Anders als bei Destruktoren sind Finalisierungsmethoden nicht deterministisch: Ein Destruktor wird aufgerufen, wenn ein Objekt explizit durch das Programm freigegeben wird. Die Finalisierungsmethode wird jedoch erst aufgerufen, wenn der Garbage Collector entscheidet, das Objekt freizugeben. AbhĂ€ngig vom Garbage Collector kann dies zu einem beliebigen Zeitpunkt geschehen, wenn festgestellt wird, dass das Programm das Objekt nicht mehr verwendet – möglicherweise auch nie bzw. am Ende der Laufzeit (siehe auch Abschnitt Determinismus).

Die Finalisierung kann in der Praxis zu Problemen fĂŒhren, wenn sie fĂŒr die Freigabe von Ressourcen verantwortlich ist:

  • Objekte, die Ressourcen verwalten, sollten diese nicht erst im Zuge der Finalisierung freigeben. Ansonsten könnte das zu blockierenden ZustĂ€nden innerhalb des Programmablaufs fĂŒhren, da der Zeitpunkt der Finalisierung nicht vorhersagbar ist.
  • Finalisierung erzeugt zusĂ€tzliche Rechenlast fĂŒr die automatische Speicherbereinigung, welche möglichst rasch und ohne den Rest des Programmablaufes zu stören durchgefĂŒhrt werden sollte.
  • 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 (beispielsweise in der Programmiersprache Java) keine Garantie dafĂŒr, dass die Finalisierungsroutine von der automatischen Speicherbereinigung ĂŒberhaupt aufgerufen wird.

In der Programmiersprache Java verfĂŒgen Objekte ĂŒber eine spezielle Methode namens finalize(), die fĂŒr diesen Zweck ĂŒberschrieben werden kann. Aus den oben genannten GrĂŒnden wird fĂŒr Java empfohlen, komplett auf Finalisierung zu verzichten und stattdessen eine explizite Terminierungsmethode zu verwenden.[11] Der automatischen Speicherbereinigung fĂ€llt dann also ausschließlich die Aufgabe der Speicherverwaltung zu.

Verbreitung

[Bearbeiten | Quelltext bearbeiten]

Einige Ă€ltere (APL, LISP, BASIC) und viele neuere 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 teilweise Bibliotheken, die eine automatische Speicherbereinigung zur VerfĂŒgung stellen, was bei der Programmierung aber leicht umgangen werden kann, beziehungsweise bei systemnaher Programmierung sogar umgangen werden muss. Aus diesem Grund können in einigen Programmiersprachen systemnah programmierte Module von der automatischen Speicherbereinigung ausgenommen werden, indem sie explizit gekennzeichnet werden (zum Beispiel in C# mit der Option /unsafe oder in Component Pascal mit der obligatorischen Anweisung IMPORT SYSTEM).

Weitere Beispiele fĂŒr Programmiersprachen mit einer automatischen Speicherverwaltung sind Smalltalk, Haskell, Oberon, Python, Ruby, OCaml, Perl, Visual Objects, ABAP, Objective-C (ab Version 2.0), D sowie alle Sprachen, die auf der Java Virtual Machine (JVM) ablaufen (Java, Groovy, Clojure, Scala, 
), sowie die, fĂŒr die Common Language Runtime von .NET entwickelt wurden (zum Beispiel C# oder VB.NET).

Apple Ökosystem

[Bearbeiten | Quelltext bearbeiten]

Apple fĂŒhrte 2007 mit der Veröffentlichung von Mac OS X Leopard (10.5) Garbage Collection als die „wichtigste VerĂ€nderung“ fĂŒr Objective-C 2.0 ein, die gemĂ€ĂŸ Apple „Objective-C dieselbe Leichtigkeit der Speicherverwaltung wie bei anderen modernen Sprachen“ brachte.[12] 2012 mit OS X Mountain Lion (10.8) wurde allerdings Garbage Collection als veraltet deklariert und die Verwendung des mit Mac OS X Lion (10.7) eingefĂŒhrten automatischen ReferenzzĂ€hlungsmechanismus (engl. Automatic reference counting, ARC) zur Kompilierungszeit auf Basis des gerade eingefĂŒhrten CLANG/LLVM 3.0 Compilers forciert.[13] Bei dieser automatisierten ReferenzzĂ€hlung[14] wird durch den Compiler Code zum Erkennen und Entfernen nicht mehr benötigter Objekten mittels ReferenzzĂ€hlung an geeigneten Stellen eingebaut.[15] Im Gegensatz zu GCs mit ReferenzzĂ€hlung lĂ€uft die automatisierte ReferenzzĂ€hlung seriell und an zur Compilezeit festgelegten Zeitpunkten und damit deterministisch.[16] Allerdings enthĂ€lt ARC keine Möglichkeit, zyklische Referenzen zu erkennen; Programmierer mĂŒssen daher die Lebensdauer ihrer Objekte explizit managen und Zyklen manuell auflösen oder mit schwachen oder unsicheren Referenzen arbeiten.[17]

Laut Apple haben Mobil-Apps ohne GC eine bessere und vorhersagbarere LeistungsfÀhigkeit.[18][19] Das GC-freie iOS als Basis ermöglicht Apple, mobile GerÀte mit weniger Speicher als die GC-basierende Konkurrenz zu bauen, welche trotzdem eine gleiche oder bessere LeistungsfÀhigkeit und Akku-Laufzeit aufweisen; ein Ansatz, der auch in der Fachpresse als architektonischer Vorteil beschrieben wurde.[20][21][22]

Literatur

[Bearbeiten | Quelltext bearbeiten]
  • Richard Jones, Rafael Lins: Garbage Collection. Algorithms for automatic dynamic memory management. John Wiley, Chichester 1996, ISBN 0-471-94148-4.
  • Richard Jones, Anthony Hosking, Eliot Moss: The Garbage Collection Handbook. The Art of Automatic Memory Menagement. (Chapman & Hall Applied algorithms and data structures series). CRC Press, Boca Raton, Fla. 2011, ISBN 978-1-4200-8279-1.

Weblinks

[Bearbeiten | Quelltext bearbeiten]
  • Kai JĂ€ger: Wie funktioniert der Java Garbage Collector? Software & Support Verlag GmbH, Mai 2009, archiviert vom Original am 13. Juni 2012; abgerufen am 28. Dezember 2015. 
  • Wie funktioniert Garbage Collection? – JavaSPEKTRUM, Mai und Juli 2006 Klaus Kreft & Angelika Langer
  • Benjamin Zorn: The Measured Cost of Garbage Collection. (PDF (404KiB)) UBC, Juli 1993, archiviert vom Original am 30. Mai 2009; abgerufen am 18. Mai 2011 (englisch).  (Alternativer Download: CiteSeerX)
  • Garbage Collection im .NET Framework (englisch)
  • Java SE 6 HotSpot Virtual Machine Garbage Collection Tuning (englisch)
  • A garbage collector for C and C++ (englisch)

Einzelnachweise

[Bearbeiten | Quelltext bearbeiten]
  1. ↑ Satish Chandra Gupta, Rajeev Palanki: Java memory leaks -- Catch me if you can. IBM DeveloperWorks, 16. August 2005, archiviert vom Original am 22. Juli 2012; abgerufen am 2. April 2015 (englisch). 
  2. ↑ How to Fix Memory Leaks in Java (Memento vom 5. Februar 2014 im Internet Archive) von Veljko Krunic (10. MĂ€rz 2009)
  3. ↑ Creating a memory leak with Java auf stackoverflow.com (englisch)
  4. ↑ Microbenchmarking C++, C#, and Java: Object creation/destruction and method call. Dr. Dobb’s Journal, 1. Juli 2005, abgerufen am 11. April 2014. 
  5. ↑ Arne SchĂ€pers, Rudolf Huttary: Daniel DĂŒsentrieb - C#, Java, C++ und Delphi im Effizienztest, Teil 2. c’t, Dezember 2003, S. 222–227, archiviert vom Original (nicht mehr online verfĂŒgbar) am 12. Dezember 2015; abgerufen am 26. Oktober 2009: „"Die Ergebnisse zeigen erstens, dass ein Garbage Collector (bei der Destruktion) vom Laufzeitverhalten her keine spĂŒrbaren Nachteile zu bringen scheint" und "Der teilweise schon fast doppelte Zeitbedarf von C++ bei der Konstruktion gegenĂŒber den anderen Kandidaten..."“  Info: Der Archivlink wurde automatisch eingesetzt und noch nicht geprĂŒft. Bitte prĂŒfe Original- und Archivlink gemĂ€ĂŸ Anleitung und entferne dann diesen Hinweis.@1@2Vorlage:Webachiv/IABot/shop.heise.de 
  6. ↑ Robert Hundt: Loop Recognition in C++/Java/Go/Scala. (PDF; 318 kB) Scala Days 2011, 27. April 2011, abgerufen am 17. November 2012 (englisch, Stanford, California): „Java shows a large GC component, but a good code performance. [...] We find that in regards to performance, C++ wins out by a large margin. [...] The Java version was probably the simplest to implement, but the hardest to analyze for performance. Specifically the effects around garbage collection were complicated and very hard to tune“ 
  7. ↑ Matthew Hertz, Emery D. Berger: Quantifying the Performance of Garbage Collection vs. Explicit Memory Management. OOPSLA 2005, 2005, abgerufen am 15. MĂ€rz 2015 (englisch): „In particular, when garbage collection has five times as much memory as required, its runtime performance matches or slightly exceeds that of explicit memory management. However, garbage collection’s performance degrades substantially when it must use smaller heaps. With three times as much memory, it runs 17% slower on average, and with twice as much memory, it runs 70% slower.“ 
  8. ↑ Benjamin Zorn: The Measured Cost of Conservative Garbage Collection. Department of Computer Science, University of Colorado Boulder, 22. Januar 1993, abgerufen am 18. November 2012 (englisch): „Conservative garbage collection does not come without a cost. In the programs measured, the garbage collection algorithm used 30–150 per cent more address space than the most space efficient explicit management algorithm. In addition, the conservative garbage collection algorithm significantly reduced the reference locality of the programs, greatly increasing the page fault rate and cache miss rate of the applications for a large range of cache and memory sizes. This result suggests that not only does the conservative garbage collection algorithm increase the size of the address space, but also frequently references the entire space it requires.“ 
  9. ↑ Constant-Time Root Scanning for Deterministic Garbage Collection (PDF; 375 kB): Garbage Collection [...] typically brings a high degree of indeterminism to the execution environment.
  10. ↑ Garbage Collection fĂŒr Parallele und Verteilte Systeme, Frank Joachim Frey, 7. Mai 2002
  11. ↑ Josuah Bloch: Effective Java, S. 31: Avoid Finalizers
  12. ↑ Objective-C 2.0 Overview (Memento vom 24. Juli 2010 im Internet Archive)
  13. ↑ Mac OS X 10.7 Lion: the Ars Technica review John Siracusa (20. Juli 2011)
  14. ↑ Rob Napier, Mugunth Kumar: iOS 6 Programming Pushing the Limit. John Wiley & Sons, 20. November 2012, abgerufen am 30. MĂ€rz 2015 (englisch): „"ARC is not garbage collection [...] this makes the code behave the way the programmer intended it to but without an extra garbage collection step. Memory is reclaimed faster than with garbage collection and decision are done at compile time rather than at run-time, which generally improves overall performance."“ 
  15. ↑ Memory Management
  16. ↑ ARC vs. GC
  17. ↑ The Clang Team: AutomaticReferenceCounting. In: Clang 3.7. Documentation. Abgerufen am 31. Mai 2015 (englisch): „It does not provide a cycle collector; users must explicitly manage the lifetime of their objects, breaking cycles manually or with weak or unsafe references.“ 
  18. ↑ Developer Tools Kickoff - session 300. In: WWDC 2011. Apple, Inc., 24. Juni 2011, abgerufen am 27. MĂ€rz 2015 (englisch): „“At the top of your wishlist of things we could do for you is bringing garbage collection to iOS. And that is exactly what we are not going to do
 Unfortunately garbage collection has a suboptimal impact on performance. Garbage can build up in your applications and increase the high water mark of your memory usage. And the collector tends to kick in at undeterministic times which can lead to very high CPU usage and stutters in the user experience. And that’s why GC has not been acceptable to us on our mobile platforms. In comparison, manual memory management with retain/release is harder to learn, and quite frankly it’s a bit of a pain in the ass. But it produces better and more predictable performance, and that’s why we have chosen it as the basis of our memory management strategy. Because out there in the real world, high performance and stutter-free user experiences are what matters to our users.”“ 
  19. ↑ JosĂ© R.C. Cruz: Automatic Reference Counting on iOS. Dr. Dobbs, 22. Mai 2012, archiviert vom Original (nicht mehr online verfĂŒgbar) am 16. August 2012; abgerufen am 30. MĂ€rz 2015 (englisch): „“Finally, the [Garbage collection] service still incurs a performance hit despite being conservative. This is one reason why garbage collection is absent on iOS.[
] ARC is an innovative approach that has many of the benefits of garbage collection, but without the performance costs. Internally, ARC is not a runtime service. It is, in fact, a deterministic two-part phase provided by the new Clang front-end.”“  Info: Der Archivlink wurde automatisch eingesetzt und noch nicht geprĂŒft. Bitte prĂŒfe Original- und Archivlink gemĂ€ĂŸ Anleitung und entferne dann diesen Hinweis.@1@2Vorlage:Webachiv/IABot/www.drdobbs.com 
  20. ↑ Felix Disselhoff: Nur 1 GB RAM?! Warum das iPhone 6 die Androiden abhĂ€ngt. curved.de, 17. November 2014, abgerufen am 22. September 2018: „Warum ist das iPhone mit nur 1 GB RAM schneller als die Android-Konkurrenz mit 2 oder 3 GB RAM? Die ErklĂ€rung ist einfach und hat mit “MĂŒll” zu tun. [
] Android braucht das Vielfache des verwendeten Speichers“ 
  21. ↑ Oliver Haslam: Why iPhone With 1GB RAM Performs Better Than Android Devices With 2GB Or More RAM? redmondpie.com, 16. November 2014, abgerufen am 25. MĂ€rz 2015. 
  22. ↑ Precious Silva: iOS 8 vs Android 5.0 Lollipop: Apple Kills Google with Memory Efficiency. International Business Times, 18. November 2014, archiviert vom Original (nicht mehr online verfĂŒgbar) am 3. April 2015; abgerufen am 7. April 2015 (englisch).  Info: Der Archivlink wurde automatisch eingesetzt und noch nicht geprĂŒft. Bitte prĂŒfe Original- und Archivlink gemĂ€ĂŸ Anleitung und entferne dann diesen Hinweis.@1@2Vorlage:Webachiv/IABot/au.ibtimes.com 
Normdaten (Sachbegriff): GND: 4269286-6 (GND Explorer, lobid, OGND, AKS)  | | Anmerkung: Ansetzungsform „Speicherbereinigung“
Abgerufen von „https://de.wikipedia.org/w/index.php?title=Garbage_Collection&oldid=254886174“
Kategorie:
  • Speicherverwaltung
Versteckte Kategorien:
  • Wikipedia:Defekte Weblinks/UngeprĂŒfte Archivlinks 2025-03
  • Wikipedia:Defekte Weblinks/UngeprĂŒfte Archivlinks 2019-09
  • Wikipedia:Defekte Weblinks/UngeprĂŒfte Archivlinks 2019-04

  • indonesia
  • Polski
  • Ű§Ù„ŰčŰ±ŰšÙŠŰ©
  • Deutsch
  • English
  • Español
  • Français
  • Italiano
  • Ù…Ű”Ű±Ù‰
  • Nederlands
  • æ—„æœŹèȘž
  • PortuguĂȘs
  • Sinugboanong Binisaya
  • Svenska
  • ĐŁĐșŃ€Đ°Ń—ĐœŃŃŒĐșа
  • Tiáșżng Việt
  • Winaray
  • äž­æ–‡
  • РуссĐșĐžĐč
Sunting pranala
Pusat Layanan

UNIVERSITAS TEKNOKRAT INDONESIA | ASEAN's Best Private University
Jl. ZA. Pagar Alam No.9 -11, Labuhan Ratu, Kec. Kedaton, Kota Bandar Lampung, Lampung 35132
Phone: (0721) 702022
Email: pmb@teknokrat.ac.id