luehe 2005/02/17 09:55:24 Modified: catalina/src/share/org/apache/catalina/core StandardContext.java Log: Removed potential WebappClassLoader leak. Consider the following example scenario: - Servlet class references RequestDispatcher. - Servlet is loaded. Any of the symbols referenced will be resolved lazily. - Servlet is invoked. Thread's context classloader has been set to the servlet's WebappClassLoader. - org.apache.catalina.core.ApplicationDispatcher is loaded, and its static "log" variable is initialized as follows: private static Log log = LogFactory.getLog(ApplicationDispatcher.class); - LogFactory.getLog() causes the context classloader (which corresponds to the WebappClassLoader) to be cached in its static "factories" Hashtable, as follows: if (classLoader != null && factory != null) factories.put(classLoader, factory); Right now, this classloader is never removed from this Hashtable when the webapp is stopped. Depending on number of deployed webapps and their servlets' execution paths, different Catalina classes will be loaded on different servlet invocation threads, and the classes' "log" initialization will cause the threads' context classloaders to be cached in LogFactory and never released from it. This patch should fix the issue. Let me know if you see any problems. Revision Changes Path 1.163 +4 -1 jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/core/StandardContext.java Index: StandardContext.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/core/StandardContext.java,v retrieving revision 1.162 retrieving revision 1.163 diff -u -r1.162 -r1.163 --- StandardContext.java 9 Feb 2005 12:20:40 -0000 1.162 +++ StandardContext.java 17 Feb 2005 17:55:24 -0000 1.163 @@ -4236,6 +4236,9 @@ // Mark this application as unavailable while we shut down setAvailable(false); + // Remove our classloader from LogFactory's 'factories' cache + LogFactory.release(getLoader().getClassLoader()); + // Binding thread ClassLoader oldCCL = bindThread();
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]