Die Profile aktiver Verfahren zur Speicherbereinigung legten einige grundlegende Mängel hinsichtlich der Funktionsweise der GC-Algorithmen im Vergleich zu einer idealen Erfassung nicht mehr benötigten Speichers offen. Die meisten Objekte in einer ausgeführten Anwendung weisen nur eine kurze Lebensdauer auf, wobei nur ganz wenige Objekte während des gesamten Zyklus einer Anwendung bestehen bleiben. Die oben geschilderten Algorithmen behandeln alle Objekte gleich. Leider ist dadurch für jedes aktive Objekt der gleiche Aufwand erforderlich (z.B. für das Verschieben oder Markieren), was sich negativ auf die Performance auswirkt. Langlebige Objekte werden ständig unnötigerweise hin und her verschoben, da sie alle Speicherbereinigungen überleben.
Moderne Garbage Collectors wie der in der neuesten Java Hotspot VM enthaltene Collector verwenden getrennte Pools für jüngere und ältere Objekte, die sogenannten Generationen. Wenn ein Objekt eine bestimmte Anzahl von Speicherbereinigungen überlebt (manchmal auch nur eine, je nach Collector), wird es von einem jüngeren in einen älteren Pool verschoben. Der ältere Pool wird erheblich seltener bereinigt, da man davon ausgeht, dass Objekte mit einer bestimmten Lebensdauer auch noch länger bestehen bleiben.
Dieser Ansatz führt zu einer erheblich verringerten Belastung des Garbage Collectors. Kurzlebige Objekte, die innerhalb eines Bereinigungsintervalls überflüssig werden, wirken sich weniger stark auf den Collector aus, da die meisten Collectors vorwiegend auf Live-Objekte ausgerichtet sind. Ältere Generationen werden weniger oft bereinigt, da so ein unnötiges Verschieben alter Objekte vermieden wird.
Innerhalb unterschiedlicher Generationen können sogar verschiedene Algorithmen angewandt werden. Beispielsweise eignet sich das Stop & Copy-Verfahren für den Pool mit den jungen Objekten, da man davon ausgeht, dass die meisten jungen Objekte eine kurze Lebensdauer haben (dieses Verfahren beeinträchtigt die Performance nur in dem Maße, wie nicht zu bereinigende Objekte vorhanden sind). Bei älteren Generationen können detailliertere Algorithmen angewandt werden, da die Performance keine so große Rolle spielt.
Sparsamer Umgang mit der Speicherbereinigung
Trotz all ihrer Vorteile verbraucht die Speicherbereinigung auch stets CPU-Kapazitäten eines laufenden Programms. Der beste Weg zur Vermeidung solcher Beeinträchtigungen liegt ganz einfach im Erstellen weniger Objekte. Weniger Objekte erfordern weniger Speicherbereinigungen, wodurch sich theoretisch die Performance verbessert.
Die Speicherbereinigung ist eine sinnvolle Funktion zur Vereinfachung alltäglicher Programmiervorgänge. Sie zählte zwar in den vergangenen Jahren zu den Schwerpunkten der Forschung, allerdings ist der Großteil der heute verwendeten Technologien ziemlich veraltet (vor allem im Computing-Bereich). Daher sollte die Speicherbereinigung stets in Maßen eingesetzt werden.
Neueste Kommentare
Noch keine Kommentare zu Systeme zur automatischen Speicherbereinigung
Kommentar hinzufügenVielen Dank für Ihren Kommentar.
Ihr Kommentar wurde gespeichert und wartet auf Moderation.