[ http://issues.apache.org/jira/browse/LOGGING-108?page=comments#action_12418592 ]
Taras Tielkes commented on LOGGING-108: --------------------------------------- Here's some proof this is happening. Change the following code (package org.apache.jasper.runtime): ---------------------- // Logger private static Log log = LogFactory.getLog(PageContextImpl.class); ---------------------- to this: ---------------------- // Logger private static Log log; static { System.err.println(">> CCL loader: " + Thread.currentThread().getContextClassLoader().getClass().getCanonicalName()); System.err.println(">> our loader: " + PageContextImpl.class.getClassLoader().getClass().getCanonicalName()); log = LogFactory.getLog(PageContextImpl.class); System.err.println(">> log loader: " + log.getClass().getClassLoader().getClass().getCanonicalName()); } ---------------------- You'll see the following output (on the console) the first time a JSP page is rendered: ---------------------- ... >> CCL loader: org.apache.catalina.loader.WebappClassLoader >> our loader: org.apache.catalina.loader.StandardClassLoader >> log loader: org.apache.catalina.loader.WebappClassLoader ... ---------------------- You can see that the current class (PageContextImpl) was loaded by a container classloader (above the webapp CL). You also see that commons-logging 1.1 used the context classloader to find an implementation of Log. Since the PageContextImpl class will never be unloaded while Tomcat runs, a WebappClassLoader leak is the result. > Classloader reference leak on Tomcat 5.5.17 with log4j in webapp > ---------------------------------------------------------------- > > Key: LOGGING-108 > URL: http://issues.apache.org/jira/browse/LOGGING-108 > Project: Commons Logging > Type: Bug > Versions: 1.1 Final > Environment: JDK 1.5.0_07, Tomcat 5.5.17 > commons-logging-api-1.1.jar is configured for the Tomcat bootstrap > commons-logging-adapters-1.1.jar is deployed with a webapp > log4j-1.2.11 is deployed with webapp > This is the configuration specifically described in the release notes for 1.1: > " New jar file commons-logging-adapters-xxx.jar is now provided. This can be > used to resolve class cast conflicts where parts of commons-logging are > deployed via different classloaders. It is not expected to be frequently > used; it is only necessary in situations where a container has deployed > commons-logging-api.jar and a webapp wants to bind to a third-party > logging implementation such as log4j. In this case, the webapp can > experience problems if it deploys commons-logging.jar as this causes > duplicates of the core commons-logging classes, but commons-logging-adapters > can be safely used." > Reporter: Taras Tielkes > Attachments: path.gif > > Some Tomcat Jasper implementation classes are initialized (that mean static > fields and static initializer) when the current thread has the webapp > classloader set as the context classloader. > An example of this is org.apache.jasper.runtime.PageContextImpl > If the first JSP page rendered on a freshly started Tomcat 5.5.17 is for a > webapp that contains the configuration described in the "Environment" section > above, a leak will occur: > The class PageContextImpl (loader by CL above Webapp classloader in > delegation chain) stays loaded for the duration of the JVM > The "log" field in this class refers to a class loaded from a > WebappClassloader. > This produces a classloader reference leak to the webapp, even after > undeployment. -- This message is automatically generated by JIRA. - If you think it was sent incorrectly contact one of the administrators: http://issues.apache.org/jira/secure/Administrators.jspa - For more information on JIRA, see: http://www.atlassian.com/software/jira --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]