Was passiert mit einer WeakReference nach dem GC von WeakReference.Target?

8

Was passiert mit der WeakReference, wenn das von WeakReference.Target referenzierte Zielobjekt als Garbage Collection erfasst wurde? Bleibt die WeakRerence am Leben und bleibt bestehen? Der Grund, warum ich frage, ist, dass ich eine Liste von WeakReferences in einer Liste gespeichert habe. Während der Laufzeit werden ständig neue WeakReferences zu dieser Liste hinzugefügt. Wenn nun das Zielobjekt stirbt, muss ich die aufgegebene WeakReference selbst aufräumen? Wenn ja, gibt es einen cleveren Trick, wie ich das machen könnte? Kann ich benachrichtigt werden, wenn eine WeakReference abgebrochen wird? Oder muss ich einen Timer einführen, der häufig diese Liste durchläuft, um zu sehen, ob irgendwelche WeakReference-Instanzen aus dieser Liste entfernt werden können.

    
bitbonk 28.11.2009, 20:44
quelle

3 Antworten

12

Dies ist ein häufiges Problem mit schwachen Referenzen. Die Referenz selbst bleibt am Leben, weil sie normale Zeiger darauf hat. Wie Sie vorschlagen, müssen Sie von Zeit zu Zeit eine manuelle Müllsammlung durchführen. Beachten Sie, dass Sie die Stubs auf Ihrem Weg wahrscheinlich bereinigen können, wenn Sie die Liste aus einem anderen Grund durchqueren. Abhängig von dem Verwendungsmuster für die Liste kann diese "auf der Seite" Speicherbereinigung sogar genug sein.

Nicht "häufig" durch die Liste zum alleinigen Zweck der Reinigung durchlaufen! Jeder tote Stummel verschwendet nur ein paar Worte der Erinnerung. Wenn die Liste nicht oft verwendet wird, sind die Rechenkosten für die Reinigung oft nicht gerechtfertigt, und wenn sie häufig verwendet wird, wird sie sich selbst reinigen, wie oben vorgeschlagen.

Es ist in einem anderen System, in dem alle Daten gesammelt wurden, aber die Probleme sind so ähnlich, dass Sie vielleicht an diesem Artikel interessiert sind wenn Sie es bekommen können.

    
Pascal Cuoq 28.11.2009, 21:06
quelle
6

Da Sie eine starke Referenz auf das WeakReference-Objekt haben, wird es nicht GC'ed. Dies ist auch beabsichtigt, weil Sie die WeakReference immer noch verwenden können, um herauszufinden, dass das Ziel GC'ed wurde.

Also, du musst den Timer-Weg gehen.

Hinzugefügt: Sie können sich auch Garbage Collection-Benachrichtigungen .

    
Vilx- 28.11.2009 20:48
quelle
1

Die beabsichtigte Verwendung besteht darin, dass Sie eine ReferenceQueue mit den WeakReferences registrieren. Wenn das Ziel erfasst wird, wird die Referenz zur Warteschlange hinzugefügt. Sie können in der Warteschlange abfragen oder warten und die WeakReference-Objekte aus Ihrer Liste entfernen.

    
OrangeDog 06.12.2010 14:40
quelle