Sylvain Laurent wrote:
I'm tracking classloader leaks more or less as a hobby and found out
that one of the (many) source of leaks come from threads that still have
a reference to a classloader through their contextClassLoader instance
variable.
So, I'm wondering : what if instead of
"private ClassLoader contextClassLoader;" we had "private
WeakReference<ClassLoader> contextClassLoaderRef" and the method
getContextClassLoader would more or less
returned contextClassLoaderRef.get() ?
Would it break many things ? is it incompatible with the specs ?
How much it would break, I wouldn't like to guess.
Incompatible? Yes. It is legitimate to use a class loader only through
Thread.getContextClassLoader.
As for solutions: I guess containers could add a fake context class
loader with a weak reference to the real one (perhaps parent could
optionally become a weak reference?). Really there needs to be more care
taken when creating threads to make sure the context class loader (and
indeed InheritableThreadLocals) are inherited only when appropriate.
Tom Hawtin