Hello all,

I wrote a wiki page to try and explain all the causes of webapp classloader 
leaks one might encounter : http://wiki.apache.org/tomcat/MemoryLeakProtection
I'd be glad to have your feedback on it !

While creating the page, I thought about 2 things to improve the protection :

1) to fix leaks like "Webapp class instance indirectly held through a 
ThreadLocal value" ( 
http://wiki.apache.org/tomcat/MemoryLeakProtection#webappClassInstanceAsThreadLocalIndirectValue
 ), I think that the only efficient way would be to renew all the threads in 
the worker pool after an application is stopped.
Unfortunately I don't see any way of doing this with the ThreadPoolExecutor 
that is now used by tomcat 7.
We could create a new ThreadPoolExecutor instance, and stop all threads of the 
old one, but this would have a big performance impact for other running 
applications...
Alternatively, we could clean all ThreadLocals in 
org.apache.tomcat.util.threads.ThreadPoolExecutor.afterExecute(Runnable, 
Throwable) . But I don't know the performance impacts that it would have on 
usual applications.

2) to fix leaks like "Threads spawned by classes loaded by the common 
classloader" ( 
http://wiki.apache.org/tomcat/MemoryLeakProtection#cclThreadSpawnedByCommonClassLoader
 ) while avoiding the side effects of stopping threads (see 
https://issues.apache.org/bugzilla/show_bug.cgi?id=48971 ), the "expendable 
classloader" can help. But before trying to provide a patch, I tried to simply 
nullify the CCL and inheritedAccessControlContext of the "leaking thread" :

  thread.setContextClassLoader(null);
  Field field = Thread.class.getDeclaredField("inheritedAccessControlContext");
  field.setAccessible(true);
  field.set(thread, null);

I tested it, it works and is much simpler than the "expendable classloader" 
trick, but I really don't know how safe it is, especially if running with a 
security manager...

What do you think ?

Sylvain
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to