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
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