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: [email protected]
For additional commands, e-mail: [email protected]