WeakReference/PhantomReference: Mitbekommen WELCHES Objekt nun GC'ed wird

T

tuxedo

Gast
Hallo zusammen,

ich bastle gerade an einem automatischen GC für meine Callback-Objekte in SIMON...

Dazu hab ich mich mal in Weak- und Phantomreferences eingelesen (u.a. Finalization and Phantom References | Javalobby).

Das Szenario:

Client-Server-Setup: Der Server erzeugt zur Laufzeit beliebige Objekte und gibt diese an den Client zurück. Tatsächlich wird nicht das Objekt, sondern nur dessen Meta-Daten übertragen. Der Client bastelt sich daraus ein Proxy-Objekt.

Das Ziel:

Wenn der Client das Objekt nicht mehr braucht, dann soll es der GC automatisch abräumen können. Aktuell geht das nicht nicht, weil es Strong-References zur Socketverbindung etc. gibt.
Aber nicht nur das: Ich muss dem Server auch sagen dass er das Objekt nun aus seiner Liste mit Callback-Objekten rausnehmen kann.

Wenn ich hier nun Weak oder Phantom-References dazwischen schalte (zwischen das Proxy-Objekt und der Socketverbindung), dann kann der GC das Proxy-Objekt prima abräumen. Nur müsste ich wissen WELCHES Proxy-Objekt er nun abgeräumt hat. Ansonsten hat der Server keine Chance seine Liste mit Callback-Objekten aufzuräumen.

Mit PhantomReferences und einer ReferenceQueue bekomme ich mich DASS das Objekt abgeräumt wurde, und ich habe eine Referenz auf die PhantomReference. Aber da das Objekt tatsächlich shcon GC'ed ist, gibt es keine Referenz mehr auf das Objekt. Steht ja auch mehr oder weniger so im JavaDoc (PhantomReference (Java 2 Platform SE v1.4.2)))

Dachte mit WeakReference geht's dann. Also flinkt umgebaut. Ergebnis: Ich bekomm wieder über die ReferenceQueue mit dass ein Objekt abgeräumt wurde, ich komme noch an die WeakReference, aber wenn ich diese dann nach dem Objekt Frage (Reference (Java 2 Platform SE v1.4.2)) kommt auch hier "null" dabei raus. Im JavaDoc steht dazu nur "If this reference object has been cleared, either by the program or by the garbage collector, then this method returns null. "

Steh ich jetzt total auf dem Schlauch und seh den Wald vor lauter Bäumen nicht mehr oder gibt es keinen Mechanismus der mit innerhalb des "GC Prozesses" sagt WELCHES Objekt nun GC'ed wird?!

Wenn es tatsächlich keinen Mechanismus gibt, dann seh ich nur folgenden Weg das zu lösen:

Weak/PhantomReference erweitern und mit einer eigenen ID (String, Long, UUID, ...) anreichern ...
Aber ob das so gut klappt hab ich noch nicht probiert.

- Alex
 

Lumaraf

Bekanntes Mitglied
An das Objekt auf das die Referenz gezeigt hat kann man aus der ReferenceQueue auch nicht mehr drankommen da der Aufruf erst nach der GC stattfindet die das referenzierte Objekt aus dem Speicher entfernt hat.

Weak/PhantomReference erweitern und mit einer eigenen ID (String, Long, UUID, ...) anreichern ...
Aber ob das so gut klappt hab ich noch nicht probiert.

Ganz genauso hab ich das schon häufiger benutzt und es hat bisher immer super funktioniert.
 
T

tuxedo

Gast
Jepp, scheint gut zu funktionieren. Hab ich heute mal kurz angetestet...

Gruß und Danke für's Feedback.

- Alex
 

Ähnliche Java Themen


Oben