It won't be strongly held IF the weak reference is the only path from a thread to the loader, unless I misunderstand the GC.  I'm a little uncomfortable with a per-graph cache - That'll bloat like crazy in a design that has a lot of scoped graph instances - way too much creation/destruction of these caches.  

If the class leaks outside of this cache - that is, the object is in an app-level graph, then there's a strong refernence to the classloader obtainable not via the weak reference.  But this is intended to handle cases where you have whole segments of graphs lined up with the classloaders, so when you change whatever's in the loader (throw away the classloader) you're throwing away (or eventually will release) all the types attached to that classloader, and the relevant instances of the graph.