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

Reply via email to