You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2016/05/16 20:09:27 UTC
svn commit: r1744125 - in /tomcat/trunk:
java/org/apache/catalina/loader/LocalStrings.properties
java/org/apache/catalina/loader/WebappClassLoaderBase.java
webapps/docs/changelog.xml
Author: markt
Date: Mon May 16 20:09:27 2016
New Revision: 1744125
URL: http://svn.apache.org/viewvc?rev=1744125&view=rev
Log:
RMI Target related memory leaks are avoidable which makes them an application bug that needs to be fixed rather than a JRE bug to work around. Therefore, start logging RMI Target related memory leaks on web application stop.
Modified:
tomcat/trunk/java/org/apache/catalina/loader/LocalStrings.properties
tomcat/trunk/java/org/apache/catalina/loader/WebappClassLoaderBase.java
tomcat/trunk/webapps/docs/changelog.xml
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=1744125&r1=1744124&r2=1744125&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/loader/LocalStrings.properties (original)
+++ tomcat/trunk/java/org/apache/catalina/loader/LocalStrings.properties Mon May 16 20:09:27 2016
@@ -22,6 +22,7 @@ webappClassLoader.readError=Resource rea
webappClassLoader.clearJdbc=The web application [{0}] registered the JDBC driver [{1}] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.
webappClassLoader.clearReferencesResourceBundlesCount=Removed [{0}] ResourceBundle references from the cache for web application [{1}]
webappClassLoader.clearReferencesResourceBundlesFail=Failed to clear ResourceBundle references for web application [{0}]
+webappClassLoader.clearRmi=Found RMI Target with stub class class [{0}] and value [{1}]. This RMI Target has been forcibly removed to prevent a memory leak.
webappClassLoader.clearRmiInfo=Failed to find class sun.rmi.transport.Target to clear context class loader for web application [{0}]. This is expected on non-Sun JVMs.
webappClassLoader.clearRmiFail=Failed to clear context class loader referenced from sun.rmi.transport.Target for web application [{0}]
webappClassLoader.checkThreadLocalsForLeaks.badKey=Unable to determine string representation of key of type [{0}]
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=1744125&r1=1744124&r2=1744125&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/loader/WebappClassLoaderBase.java (original)
+++ tomcat/trunk/java/org/apache/catalina/loader/WebappClassLoaderBase.java Mon May 16 20:09:27 2016
@@ -2213,11 +2213,15 @@ public abstract class WebappClassLoaderB
*/
private void clearReferencesRmiTargets() {
try {
- // Need access to the ccl field of sun.rmi.transport.Target
+ // Need access to the ccl field of sun.rmi.transport.Target to find
+ // the leaks
Class<?> objectTargetClass =
Class.forName("sun.rmi.transport.Target");
Field cclField = objectTargetClass.getDeclaredField("ccl");
cclField.setAccessible(true);
+ // Need access to the stub field to report the leaks
+ Field stubField = objectTargetClass.getDeclaredField("stub");
+ stubField.setAccessible(true);
// Clear the objTable map
Class<?> objectTableClass =
@@ -2237,6 +2241,9 @@ public abstract class WebappClassLoaderB
Object cclObject = cclField.get(obj);
if (this == cclObject) {
iter.remove();
+ Object stubObject = stubField.get(obj);
+ log.error(sm.getString("webappClassLoader.clearRmi",
+ stubObject.getClass().getName(), stubObject));
}
}
}
@@ -2263,16 +2270,8 @@ public abstract class WebappClassLoaderB
} catch (ClassNotFoundException e) {
log.info(sm.getString("webappClassLoader.clearRmiInfo",
getContextName()), e);
- } catch (SecurityException e) {
- log.warn(sm.getString("webappClassLoader.clearRmiFail",
- getContextName()), e);
- } catch (NoSuchFieldException e) {
- log.warn(sm.getString("webappClassLoader.clearRmiFail",
- getContextName()), e);
- } catch (IllegalArgumentException e) {
- log.warn(sm.getString("webappClassLoader.clearRmiFail",
- getContextName()), e);
- } catch (IllegalAccessException e) {
+ } catch (SecurityException | NoSuchFieldException | IllegalArgumentException |
+ IllegalAccessException e) {
log.warn(sm.getString("webappClassLoader.clearRmiFail",
getContextName()), e);
}
Modified: tomcat/trunk/webapps/docs/changelog.xml
URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=1744125&r1=1744124&r2=1744125&view=diff
==============================================================================
--- tomcat/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/trunk/webapps/docs/changelog.xml Mon May 16 20:09:27 2016
@@ -45,6 +45,16 @@
issues do not "pop up" wrt. others).
-->
<section name="Tomcat 9.0.0.M7" rtext="in development">
+ <subsection name="Catalina">
+ <changelog>
+ <fix>
+ RMI Target related memory leaks are avoidable which makes them an
+ application bug that needs to be fixed rather than a JRE bug to work
+ around. Therefore, start logging RMI Target related memory leaks on web
+ application stop. (markt)
+ </fix>
+ </changelog>
+ </subsection>
<subsection name="Coyote">
<changelog>
<fix>
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org