I know that the GC collects objects that have no references pointing to the object in question, but what happens in the event of listener objects?
Suppose you have an AnimationDelegate that listens to data from a DataSupplier. When the DataSupplier recieves data and fires off the event to the AnimationDelegate, the delegate will then invalidate (/update/redraw etc…) a Graphic. Now say the screen is disabled, removed or, through various means, the graphic can no longer draw and is collected. The AnimationDelegate is still registered to the DataSupplier. How will the GC know to collect it? Should one unregister the delegate in the graphics finalize() method?
I’m afraid the answer won’t fit the format 🙂 Start with this article by Brian Goetz: he’s a perfect person to read if you’re interested in GC.
Basically, as soon as object is not reachable from active threads, it’s collected. The actual algorithms vary even within one JVM, but the point stays the same: what’s not reachable is a garbage. What’s reachable is not a garbage. Easy.
GC will not collect the
Graphicin your example, as it’s reachable fromAnimationDelegate, which in turn is reachable (via subscription) fromDataSupplierwhich is supposed to be reachable from some active thread. So the answer will be: your assumptions are wrong; GC will not collect anything here.To answer your question, unsubscribe everything you don’t need.
As @rfeak rightfully says,
finalize()is a big no-no. It’s almost impossible to use it properly, and it’s way too easy to use it wrong. That said,it’s OK to use it as a backup solution when you need to free resources. But generally your application has to be able to work just fine even iffinalize()never gets called.