I began this discussion thread because in revision 830 Bob committed 
changes with a description "Replace ReferenceCache w/ MapMaker". It's 
not clear what really changed between ReferenceCache and MapMaker. If 
you take a look at MapMaker, FinalizableReferenceQueue and Finalizer it 
looks like *some* references (ones that expire) are now cleared without 
an active thread, but not all. As we've discussed in that other thread, 
it is certainly possible to clear *all* references without an active 
thread. The question is whether Bob plans on doing this for Guice 2.0 or 
not.

        I'd love to hear what Bob has in mind :)

Thanks,
Gili

Stuart McCulloch wrote:
> 2009/2/8 Gili <[email protected] <mailto:[email protected]>>
> 
> 
>     Stuart,
> 
>     It was my understanding [1] that there was no need for a worker
>     thread. I thought that we had established that there were concurrent
>     reference map implementations out there that will do a great job
>     without it and one of them might even end up in Java7 (all the better
>     since we'd end up using a core Java API).
> 
>     [1] http://code.google.com/p/google-guice/issues/detail?id=288
> 
> 
> I'll have to defer to Bob, Doug and the other JSR166 experts on this ;)
> [ http://code.google.com/p/google-guice/issues/detail?id=288#c11 ]
> 
> a concurrent reference map is imho an important (and useful) feature,
> so I don't mind them taking time in making sure everything works ok
> 
>     I personally favor any of the solutions you mentioned except for
>     running Guice in the system or boot classpath.
> 
>     Gili
> 
>     On Feb 8, 7:10 am, Stuart McCulloch <[email protected]
>     <mailto:[email protected]>> wrote:
>      > 2009/2/7 Gili <[email protected]
>     <mailto:[email protected]>>
>      >
>      > > Hi,
>      >
>      > > I noticed you guys committed some new code to tackle the memory
>     leaks
>      > > recently so I gave it a spin. I still see the memory leak under
>      > > Glassfish v2ur2 and the GC root that is keeping the instances alive
>      > > seems to be com.google.inject.internal.Finalizer.
>      >
>      > > Stuart, can you please look into whether Glassfish or Guice is at
>      > > fault here?
>      >
>      > Hi Gili,
>      >
>      > The current reference cache in Guice relies on a background
>     worker thread
>      > to dequeue and finalize references. Because an active Java thread
>     is a GC
>      > root this thread must be stopped when it's no longer required,
>     otherwise any
>      > classes that it refers to (and their classloaders) cannot be
>     collected.
>      >
>      > There are various ways to do this - some libraries expose a
>     public API that
>      > containers can use to tell the thread when to stop. Others use
>     "declarative"
>      > metadata (such as the Bundle-Activator manifest entry in OSGi) to
>     refer to
>      > names of helper classes that can take part in certain managed
>     lifecycles.
>      >
>      > The approach used in Guice (and google-collections) is for the
>     thread itself
>      > to try and detect when it's no longer required. It does this by
>     waiting to
>      > see
>      > when the reference queue's classloader is eligible for GC, which
>     means the
>      > client application no longer (strongly) refers to the queue.
>      >
>      > For this to work properly the worker thread must have no strong
>     references
>      > to the client application's classloader, otherwise it would
>     indirectly keep
>      > the
>      > queue alive. This is why Bob's code goes to great lengths to try
>     and load
>      > the worker class in a separate classloader unconnected to the
>     application.
>      >
>      > While this works in most environments, there are two potential
>     references
>      > that can occur when you spawn a thread from a container managed
>     thread:
>      >
>      >   1) the new thread automatically picks up any InheritedThreadLocals
>      >
>      >   2) it gets the current AccessControlContext (only when security
>     is on)
>      >
>      > These references are internal to the thread and cannot be removed
>     using
>      > the public API or other runtime independent methods. So if either
>     of these
>      > situations occur the worker thread will not stop and you will see
>     a "leak".
>      >
>      > 1) could occur for many reasons, such as an application or
>     container not
>      > removing its thread locals before returning a thread to the
>     common pool.
>      >
>      > 2) is expected in almost all Java EE environments, hence what you
>     see :(
>      >
>      > So... where do we go from here?
>      >
>      > Well, you could consider putting Guice on the system or boot
>     classpath, ie.
>      > tied to some classloader that's above the client classloader. So
>     while the
>      > worker thread will still have a reference to the system-level
>     classloader,
>      > it
>      > shouldn't stop the client classloader from being unloaded. The
>     downside is
>      > that you can't replace Guice without restarting the container -
>     but this
>      > might
>      > be acceptable, given you're more likely to replace client apps than
>      > libraries
>      >
>      > [ at the very least you'd need the
>     com.google.inject.internal.Finalizer
>      > class
>      >   available on the system / container classpath, you don't need
>     all of Guice
>      > ]
>      >
>      > Another option is to remove the need for a worker thread, but I'm
>     not sure
>      > if
>      > this is feasible (there are alternative reference maps out there
>     but YMMV :)
>      > Note that you'll also have a separate worker thread for each
>     application
>      > that
>      > jarjars the reference queue under a different package ( ie. if
>     you use Guice
>      > and google-collections you might end up with two worker threads! )
>      >
>      > Alternatively, the google team could think again about exposing
>     an API to
>      > shutdown this thread - or possibly provide a BundleActivator
>     class that
>      > could manage the thread from an OSGi perspective, then you
>     wouldn't be
>      > exposing a public API but would help anyone using an OSGi
>     container* ;)
>      >
>      > [ * it would introduce a compile dep on OSGi for the library, but not
>      > clients ]
>      >
>      > The last resort would be to patch Guice to shutdown this thread
>     and use
>      > this in your application rather than the official binary - but
>     this may not
>      > be
>      > an option for everyone ;)
>      >
>      > Of course once the JDK provides an inbuilt reference map these issues
>      > should disappear (and you'd only need one worker thread) - most
>     of the
>      > problems stem from doing all of this outside of the JDK core classes!
>      >
>      > HTH
>      >
>      > Thanks,
>      >
>      > > Gili
>      >
>      > --
>      > Cheers, Stuart
> 
> 
> 
> 
> -- 
> Cheers, Stuart
> 
> > 

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"google-guice" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/google-guice?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to