Das Versagen in der Abstraktion ist eigentlich nicht die Tatsache, dass die Speicherbereinigung nicht deterministisch ist, sondern die Idee, dass Objekte an Dingen "interessiert" sind, auf die sie sich beziehen, und nicht an Dingen, an denen sie nicht festhalten Verweise. Um zu sehen, warum, betrachten Sie das Szenario eines Objekts, das einen Zähler dafür enthält, wie oft ein bestimmtes Steuerelement gezeichnet wird. Bei der Erstellung wird das "Paint" -Ereignis des Steuerelements abonniert und bei der Entsorgung abgemeldet. Das Klickereignis erhöht einfach ein Feld und eine Methode getTotalClicks()
gibt den Wert dieses Feldes zurück.
Wenn das Zählerobjekt erstellt wird, muss es einen Verweis auf sich selbst in der Steuerung speichern, die es überwacht. Das Steuerelement kümmert sich wirklich nicht um das Zählerobjekt und wäre genauso glücklich, wenn das Zählerobjekt und der Verweis darauf nicht mehr existieren würden, aber solange der Verweis existiert, ruft es jedes Mal den Ereignishandler dieses Objekts auf es malt sich. Diese Aktion ist für die Steuerung völlig nutzlos, wäre jedoch für jeden nützlich, der getTotalClicks()
das Objekt jemals aufrufen würde .
Wenn beispielsweise eine Methode ein neues "Farbzähler" -Objekt erstellen, eine Aktion für das Steuerelement ausführen, beobachten würde, wie oft das Steuerelement neu gestrichen wurde, und dann das Farbzählerobjekt verlassen würde, würde das Objekt das Ereignis sogar abonniert bleiben obwohl es niemanden interessieren würde, wenn das Objekt und alle Verweise darauf einfach verschwinden würden. Die Objekte können jedoch erst erfasst werden, wenn das Steuerelement selbst aktiviert ist. Wenn die Methode innerhalb der Lebensdauer des Steuerelements viele tausend Mal aufgerufen würde [ein plausibles Szenario], könnte dies zu einem Speicherüberlauf führen, wenn jedoch die Kosten für N Aufrufe wahrscheinlich O (N ^ 2) oder O betragen würden (N ^ 3) es sei denn, die Abonnementverarbeitung war sehr effizient und die meisten Vorgänge umfassten tatsächlich kein Malen.
Dieses spezielle Szenario könnte dadurch gelöst werden, dass die Steuerung einen schwachen Bezug zum Gegenobjekt behält und keinen starken. Ein schwaches Abonnementmodell ist hilfreich, funktioniert aber im allgemeinen Fall nicht. Angenommen, anstatt ein Objekt zu haben, das eine einzelne Art von Ereignis von einem einzelnen Steuerelement aus überwacht, möchte man ein Ereignisprotokollierungsobjekt haben, das mehrere Steuerelemente überwacht, und der Mechanismus zur Ereignisbehandlung des Systems war so, dass jedes Steuerelement eine Referenz benötigte zu einem anderen Ereignis-Logger-Objekt. In diesem Fall sollte das Objekt, das ein Steuerelement mit dem Ereignisprotokollierer verknüpft, nur so lange aktiv bleiben, wie beideDie zu überwachende Steuerung und der Ereignisprotokollierer bleiben nützlich. Wenn weder das Steuerelement noch der Ereignisprotokollierer einen starken Verweis auf das Verknüpfungsereignis enthalten, wird es nicht mehr existieren, obwohl es immer noch "nützlich" ist. Wenn eines der beiden Ereignisse ein starkes Ereignis enthält, kann die Lebensdauer des Verknüpfungsobjekts unbrauchbar verlängert werden, selbst wenn das andere stirbt.
Wenn irgendwo im Universum kein Verweis auf ein Objekt existiert, kann das Objekt sicher als nutzlos betrachtet und aus der Existenz ausgeschlossen werden. Die Tatsache, dass ein Verweis auf ein Objekt existiert, bedeutet jedoch nicht, dass das Objekt "nützlich" ist. In vielen Fällen hängt die tatsächliche Nützlichkeit von Objekten von der Existenz von Verweisen auf andere Objekte ab, die aus GC-Sicht völlig unabhängig von ihnen sind.
Wenn Objekte deterministisch benachrichtigt werden, wenn niemand an ihnen interessiert ist, können sie diese Informationen verwenden, um sicherzustellen, dass jeder, der von diesem Wissen profitieren würde, informiert wird. In Ermangelung einer solchen Benachrichtigung gibt es jedoch keine allgemeine Möglichkeit zu bestimmen, welche Objekte als "nützlich" angesehen werden, wenn man nur die Menge der vorhandenen Referenzen kennt und nicht die semantische Bedeutung, die diesen Referenzen zugeordnet ist. Somit wäre jedes Modell, das davon ausgeht, dass das Vorhandensein oder Nichtvorhandensein von Referenzen für ein automatisiertes Ressourcenmanagement ausreicht, zum Scheitern verurteilt, selbst wenn der GC die Aufgabe eines Objekts sofort erkennen könnte.