Author: markt
Date: Fri Nov  9 11:49:37 2018
New Revision: 1846236

URL: http://svn.apache.org/viewvc?rev=1846236&view=rev
Log:
Fix https://bz.apache.org/bugzilla/show_bug.cgi?id=62897
Provide a property clearReferencesThreadLocals on the standard Context 
implementation that enables the check for memory leaks via ThreadLocals to be 
disabled because this check depends on the use of an API that has been 
deprecated in later versions of Java.

Modified:
    tomcat/trunk/java/org/apache/catalina/core/StandardContext.java
    tomcat/trunk/java/org/apache/catalina/core/mbeans-descriptors.xml
    tomcat/trunk/java/org/apache/catalina/loader/WebappClassLoaderBase.java
    tomcat/trunk/webapps/docs/changelog.xml
    tomcat/trunk/webapps/docs/config/context.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=1846236&r1=1846235&r2=1846236&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/core/StandardContext.java (original)
+++ tomcat/trunk/java/org/apache/catalina/core/StandardContext.java Fri Nov  9 
11:49:37 2018
@@ -743,6 +743,12 @@ public class StandardContext extends Con
     private boolean clearReferencesObjectStreamClassCaches = true;
 
     /**
+     * Should Tomcat attempt to clear references to classes loaded by this 
class
+     * loader from ThreadLocals?
+     */
+    private boolean clearReferencesThreadLocals = true;
+
+    /**
      * Should Tomcat skip the memory leak checks when the web application is
      * stopped as part of the process of shutting down the JVM?
      */
@@ -2697,6 +2703,20 @@ public class StandardContext extends Con
     }
 
 
+    public boolean getClearReferencesThreadLocals() {
+        return clearReferencesThreadLocals;
+    }
+
+
+    public void setClearReferencesThreadLocals(boolean 
clearReferencesThreadLocals) {
+        boolean oldClearReferencesThreadLocals = 
this.clearReferencesThreadLocals;
+        this.clearReferencesThreadLocals = clearReferencesThreadLocals;
+        support.firePropertyChange("clearReferencesThreadLocals",
+                oldClearReferencesThreadLocals,
+                this.clearReferencesThreadLocals);
+    }
+
+
     public boolean getSkipMemoryLeakChecksOnJvmShutdown() {
         return skipMemoryLeakChecksOnJvmShutdown;
     }
@@ -4967,8 +4987,10 @@ public class StandardContext extends Con
                         getClearReferencesHttpClientKeepAliveThread());
                 
setClassLoaderProperty("clearReferencesObjectStreamClassCaches",
                         getClearReferencesObjectStreamClassCaches());
-                setClassLoaderProperty("skipMemoryLeakChecksOnJvmShutdown",
-                        getSkipMemoryLeakChecksOnJvmShutdown());
+                
setClassLoaderProperty("clearReferencesObjectStreamClassCaches",
+                        getClearReferencesObjectStreamClassCaches());
+                setClassLoaderProperty("clearReferencesThreadLocals",
+                        getClearReferencesThreadLocals());
 
                 // By calling unbindThread and bindThread in a row, we setup 
the
                 // current Thread CCL to be the webapp classloader

Modified: tomcat/trunk/java/org/apache/catalina/core/mbeans-descriptors.xml
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/mbeans-descriptors.xml?rev=1846236&r1=1846235&r2=1846236&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/core/mbeans-descriptors.xml (original)
+++ tomcat/trunk/java/org/apache/catalina/core/mbeans-descriptors.xml Fri Nov  
9 11:49:37 2018
@@ -94,6 +94,10 @@
                description="Should Tomcat attempt to terminate TimerThreads 
that have been started by the web application? Advisable to be used only in a 
development environment."
                type="boolean"/>
 
+    <attribute name="clearReferencesThreadLocals"
+               description="Should Tomcat attempt to clear ThreadLocal 
variables that have been populated with classes loaded by the web application?"
+               type="boolean"/>
+
     <attribute name="configFile"
                description="Location of the context.xml resource or file"
                type="java.net.URL"/>

Modified: 
tomcat/trunk/java/org/apache/catalina/loader/WebappClassLoaderBase.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/loader/WebappClassLoaderBase.java?rev=1846236&r1=1846235&r2=1846236&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/loader/WebappClassLoaderBase.java 
(original)
+++ tomcat/trunk/java/org/apache/catalina/loader/WebappClassLoaderBase.java Fri 
Nov  9 11:49:37 2018
@@ -370,6 +370,12 @@ public abstract class WebappClassLoaderB
     private boolean clearReferencesObjectStreamClassCaches = true;
 
     /**
+     * Should Tomcat attempt to clear references to classes loaded by this 
class
+     * loader from ThreadLocals?
+     */
+    private boolean clearReferencesThreadLocals = true;
+
+    /**
      * Should Tomcat skip the memory leak checks when the web application is
      * stopped as part of the process of shutting down the JVM?
      */
@@ -621,6 +627,16 @@ public abstract class WebappClassLoaderB
     }
 
 
+    public boolean getClearReferencesThreadLocals() {
+        return clearReferencesThreadLocals;
+    }
+
+
+    public void setClearReferencesThreadLocals(boolean 
clearReferencesThreadLocals) {
+        this.clearReferencesThreadLocals = clearReferencesThreadLocals;
+    }
+
+
     public boolean getSkipMemoryLeakChecksOnJvmShutdown() {
         return skipMemoryLeakChecksOnJvmShutdown;
     }
@@ -1587,7 +1603,9 @@ public abstract class WebappClassLoaderB
         }
 
         // Check for leaks triggered by ThreadLocals loaded by this class 
loader
-        checkThreadLocalsForLeaks();
+        if (clearReferencesThreadLocals) {
+            checkThreadLocalsForLeaks();
+        }
 
         // Clear RMI Targets loaded by this class loader
         if (clearReferencesRmiTargets) {

Modified: tomcat/trunk/webapps/docs/changelog.xml
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=1846236&r1=1846235&r2=1846236&view=diff
==============================================================================
--- tomcat/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/trunk/webapps/docs/changelog.xml Fri Nov  9 11:49:37 2018
@@ -88,6 +88,14 @@
         configuration files using the ConfigurationSource API. JASPIC and
         storeconfig remain file based. (remm)
       </update>
+      <add>
+        <bug>62897</bug>: Provide a property
+        (<code>clearReferencesThreadLocals</code>) on the standard
+        <code>Context</code> implementation that enables the check for memory
+        leaks via <code>ThreadLocal</code>s to be disabled because this check
+        depends on the use of an API that has been deprecated in later versions
+        of Java. (markt)
+      </add>
     </changelog>
   </subsection>
   <subsection name="Coyote">

Modified: tomcat/trunk/webapps/docs/config/context.xml
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/config/context.xml?rev=1846236&r1=1846235&r2=1846236&view=diff
==============================================================================
--- tomcat/trunk/webapps/docs/config/context.xml (original)
+++ tomcat/trunk/webapps/docs/config/context.xml Fri Nov  9 11:49:37 2018
@@ -776,6 +776,13 @@
         not specified, the default value of <code>false</code> will be 
used.</p>
       </attribute>
 
+      <attribute name="clearReferencesThreadLocals" required="false">
+        <p>If <code>true</code>, Tomcat attempts to clear
+        <code>java.lang.ThreadLocal</code> variables that have been populated
+        with classes loaded by the web application. If not specified, the
+        default value of <code>true</code> will be used.</p>
+      </attribute>
+
       <attribute name="copyXML" required="false">
         <p>Set to <code>true</code> if you want a context XML descriptor
         embedded inside the application (located at



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to