Author: markt Date: Mon Sep 8 11:13:06 2014 New Revision: 1623360 URL: http://svn.apache.org/r1623360 Log: Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=56530 Add a web application class loader implementation that supports the parallel loading of web application classes.
Added: tomcat/trunk/java/org/apache/catalina/loader/ParallelWebappClassLoader.java (with props) tomcat/trunk/java/org/apache/catalina/loader/WebappClassLoaderBase.java - copied, changed from r1623346, tomcat/trunk/java/org/apache/catalina/loader/WebappClassLoader.java Modified: tomcat/trunk/java/org/apache/catalina/core/StandardContext.java tomcat/trunk/java/org/apache/catalina/core/StandardHost.java tomcat/trunk/java/org/apache/catalina/loader/JdbcLeakPrevention.java tomcat/trunk/java/org/apache/catalina/loader/LocalStrings.properties tomcat/trunk/java/org/apache/catalina/loader/WebappClassLoader.java tomcat/trunk/java/org/apache/catalina/loader/WebappLoader.java tomcat/trunk/java/org/apache/catalina/loader/mbeans-descriptors.xml tomcat/trunk/java/org/apache/catalina/security/SecurityClassLoad.java tomcat/trunk/java/org/apache/tomcat/InstrumentableClassLoader.java tomcat/trunk/test/org/apache/catalina/loader/TestWebappClassLoaderMemoryLeak.java tomcat/trunk/test/org/apache/catalina/loader/TestWebappClassLoaderThreadLocalMemoryLeak.java tomcat/trunk/webapps/docs/changelog.xml tomcat/trunk/webapps/docs/config/context.xml tomcat/trunk/webapps/docs/config/loader.xml Modified: tomcat/trunk/java/org/apache/catalina/core/StandardContext.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/StandardContext.java?rev=1623360&r1=1623359&r2=1623360&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/core/StandardContext.java (original) +++ tomcat/trunk/java/org/apache/catalina/core/StandardContext.java Mon Sep 8 11:13:06 2014 @@ -762,8 +762,8 @@ public class StandardContext extends Con /** * If an HttpClient keep-alive timer thread has been started by this web * application and is still running, should Tomcat change the context class - * loader from the current {@link WebappClassLoader} to - * {@link WebappClassLoader#parent} to prevent a memory leak? Note that the + * loader from the current {@link ClassLoader} to + * {@link ClassLoader#getParent()} to prevent a memory leak? Note that the * keep-alive timer thread will stop on its own once the keep-alives all * expire however, on a busy system that might not happen for some time. */ Modified: tomcat/trunk/java/org/apache/catalina/core/StandardHost.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/StandardHost.java?rev=1623360&r1=1623359&r2=1623360&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/core/StandardHost.java (original) +++ tomcat/trunk/java/org/apache/catalina/core/StandardHost.java Mon Sep 8 11:13:06 2014 @@ -39,7 +39,7 @@ import org.apache.catalina.LifecycleEven import org.apache.catalina.LifecycleException; import org.apache.catalina.LifecycleListener; import org.apache.catalina.Valve; -import org.apache.catalina.loader.WebappClassLoader; +import org.apache.catalina.loader.WebappClassLoaderBase; import org.apache.tomcat.util.ExceptionUtils; /** @@ -749,8 +749,8 @@ public class StandardHost extends Contai for (Map.Entry<ClassLoader, String> entry : childClassLoaders.entrySet()) { ClassLoader cl = entry.getKey(); - if (cl instanceof WebappClassLoader) { - if (!((WebappClassLoader) cl).getState().isAvailable()) { + if (cl instanceof WebappClassLoaderBase) { + if (!((WebappClassLoaderBase) cl).getState().isAvailable()) { result.add(entry.getValue()); } } Modified: tomcat/trunk/java/org/apache/catalina/loader/JdbcLeakPrevention.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/loader/JdbcLeakPrevention.java?rev=1623360&r1=1623359&r2=1623360&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/loader/JdbcLeakPrevention.java (original) +++ tomcat/trunk/java/org/apache/catalina/loader/JdbcLeakPrevention.java Mon Sep 8 11:13:06 2014 @@ -27,14 +27,15 @@ import java.util.HashSet; import java.util.List; /** - * This class is loaded by the {@link WebappClassLoader} to enable it to + * This class is loaded by {@link WebappClassLoaderBase} to enable it to * deregister JDBC drivers forgotten by the web application. There are some - * classloading hacks involved - see {@link WebappClassLoader#clearReferences()} - * for details - but the short version is do not just create a new instance of - * this class with the new keyword. + * classloading hacks involved - see + * {@link WebappClassLoaderBase#clearReferences()} for details - but the short + * version is do not just create a new instance of this class with the new + * keyword. * - * Since this class is loaded by {@link WebappClassLoader}, it can not refer to - * any internal Tomcat classes as that will cause the security manager to + * Since this class is loaded by {@link WebappClassLoaderBase}, it can not refer + * to any internal Tomcat classes as that will cause the security manager to * complain. */ public class JdbcLeakPrevention { Modified: tomcat/trunk/java/org/apache/catalina/loader/LocalStrings.properties URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/loader/LocalStrings.properties?rev=1623360&r1=1623359&r2=1623360&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/loader/LocalStrings.properties (original) +++ tomcat/trunk/java/org/apache/catalina/loader/LocalStrings.properties Mon Sep 8 11:13:06 2014 @@ -51,6 +51,9 @@ webappClassLoader.addTransformer.duplica webappClassLoader.addTransformer=Added class file transformer [{0}] to web application [{1}]. webappClassLoader.removeTransformer=Removed class file transformer [{0}] from web application [{1}]. webappClassLoader.transformError=Instrumentation error: could not transform class [{0}] because its class file format is not legal. + +webappClassLoaderParallel.registrationFailed=Registration of org.apache.catalina.loader.ParallelWebappClassLoader as capable of loading classes in parallel failed + webappLoader.addRepository=Adding repository {0} webappLoader.deploy=Deploying class repositories to work directory {0} webappLoader.jarDeploy=Deploy JAR {0} to {1} Added: tomcat/trunk/java/org/apache/catalina/loader/ParallelWebappClassLoader.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/loader/ParallelWebappClassLoader.java?rev=1623360&view=auto ============================================================================== --- tomcat/trunk/java/org/apache/catalina/loader/ParallelWebappClassLoader.java (added) +++ tomcat/trunk/java/org/apache/catalina/loader/ParallelWebappClassLoader.java Mon Sep 8 11:13:06 2014 @@ -0,0 +1,73 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.catalina.loader; + +import org.apache.catalina.LifecycleException; + +public class ParallelWebappClassLoader extends WebappClassLoaderBase { + + private static final org.apache.juli.logging.Log log = + org.apache.juli.logging.LogFactory.getLog(ParallelWebappClassLoader.class); + + static { + boolean result = ClassLoader.registerAsParallelCapable(); + if (!result) { + log.warn(sm.getString("webappClassLoaderParallel.registrationFailed")); + } + } + + public ParallelWebappClassLoader() { + super(); + } + + + public ParallelWebappClassLoader(ClassLoader parent) { + super(parent); + } + + + /** + * Returns a copy of this class loader without any class file + * transformers. This is a tool often used by Java Persistence API + * providers to inspect entity classes in the absence of any + * instrumentation, something that can't be guaranteed within the + * context of a {@link java.lang.instrument.ClassFileTransformer}'s + * {@link java.lang.instrument.ClassFileTransformer#transform(ClassLoader, + * String, Class, java.security.ProtectionDomain, byte[]) transform} method. + * <p> + * The returned class loader's resource cache will have been cleared + * so that classes already instrumented will not be retained or + * returned. + * + * @return the transformer-free copy of this class loader. + */ + @Override + public ParallelWebappClassLoader copyWithoutTransformers() { + + ParallelWebappClassLoader result = new ParallelWebappClassLoader(getParent()); + + super.copyStateWithoutTransformers(result); + + try { + result.start(); + } catch (LifecycleException e) { + throw new IllegalStateException(e); + } + + return result; + } +} Propchange: tomcat/trunk/java/org/apache/catalina/loader/ParallelWebappClassLoader.java ------------------------------------------------------------------------------ svn:eol-style = native --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org