Sie basiert sie darauf, dass sich an jedem verwalteten Objekt ein Zähler befindet, der beim Einrichten eines Verweises auf dieses Objekt erhöht und beim Löschen eines Verweises verringert wird. Fällt der Zähler auf 0, kann das Objekt selbst und alle in ihm enthaltenen Verweise gelöscht werden.
Das Dateisystem von Unix benutzt traditionell diese Form der SpeicherVerwaltung, um beim Löschen der letzten Referenz auf eine Datei den Plattenplatz freizugeben.
Siehe die (automatische) Speicherverwaltungs Referenz auf http://www.xanalys.com/software_tools/mm/glossary/r.html#reference.counting
Der Link ist anscheinend defekt -- RalfEbert
Da die ReferenzZählung keinerlei Unterstützung seitens der Sprache oder Systembibliothek benötigt, wird sie sehr oft in einfachen Systemen verwendet. In C++ zB typischerweise in Klassen (sog. Smart Pointers). Das alte Microsoft OLE unterstützte nur ReferenzZählung, das mit dem neuen Design (.NET) auch bessere automatische Speicherverwaltungsmechanismen unterstützen wird. (Hoffentlich, --ReiniUrban)
Es gibt Verfahren, die die ReferenzZählung dahingehend ergänzen, dass diese solche Zyklen erkennen und ebenfalls freigeben können. Ein solches Verfahren wurde z.B. in der GarbageCollection der Programmiersprache Python [SprachePython] ab der Version 2.0 implementiert. Hierbei handelt es sich um ein innovatives Verfahren (siehe http://arctrix.com/nas/python/gc/).
Auch Perl beeinhaltet einen zusätzlichen GarbageCollection Zyklus um Objekte vor dem Shutdown aufzuräumen. Für Perl 6 (noch nicht fertig gestellt) ist ein komplettes Neudesign geplant, um eine auf GarbageCollection umsteigen zu könneni, die auch Zyklen erfasst.
Manche Dialekte der SpracheSmalltalk beinhalten ein dramatisch verbessertes Konzept, die verzögerte Referenzzählung. ( http://www.xanalys.com/software_tools/mm/glossary/d.html#deferred.reference.counting) [Broken!] Dabei werden nur globale Heap- Objekte, aber keine lokalen Stack-Variablen gezählt. Zyklische Datenstrukturen können mit diesem Verfahren alleine trotzdem nicht bereinigt werden. Ein weiteres Konzept sind "Schwache Referenzen" (Weak References). Diese werden vom Garbage-Collector ignoriert, ein Feature, was ursprünglich als Bestandteil des Garbage-Collectors selbst benötigt wurde, mittlerweile aber auch für andere Augaben verwendbar ist (siehe VisualWorks Version 7.2). Mehr zur Speicherverwaltung von SpracheSmalltalk siehe GarbageCollection.
SpracheLava bietet dem Programmierer die Unterscheidung von Vorwärts- und Rückwärts-Pointern an (denen intern zwei verschiedene Referenzzähler entsprechen). Bei sinnvoller Benutzung dieser Unterscheidung kann dadurch das Zyklenproblem vermieden werden.
Siehe http://lavape.sourceforge.net/doc/html/PointersRefCounts.htm.
Diskussion |
Ha, das ist ja wie die Hardlinks in Unix-Dateisystemen. :-)--hs
Nicht ganz: Im UnixDateisystem sind zusätzliche HardLinks nur auf Dateien, aber nicht auf Verzeichnisse erlaubt. Dadurch ist sichergestellt, dass ein UnixDateisystem immer ein GerichteterAzyklischerGraph? (kurz GAG) bleibt. Die Links auf das aktuelle Verzeichnis (.) und das übergeordnete Verzeichnis (..) werden in der Software gesondert behandelt. --PeterFunk