Author: markt
Date: Thu Oct 29 12:03:48 2009
New Revision: 830908
URL: http://svn.apache.org/viewvc?rev=830908&view=rev
Log:
Make leak prevention listener more configurable
Modified:
tomcat/trunk/java/org/apache/catalina/core/JreMemoryLeakPreventionListener.java
tomcat/trunk/webapps/docs/config/listeners.xml
Modified:
tomcat/trunk/java/org/apache/catalina/core/JreMemoryLeakPreventionListener.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/JreMemoryLeakPreventionListener.java?rev=830908&r1=830907&r2=830908&view=diff
==============================================================================
---
tomcat/trunk/java/org/apache/catalina/core/JreMemoryLeakPreventionListener.java
(original)
+++
tomcat/trunk/java/org/apache/catalina/core/JreMemoryLeakPreventionListener.java
Thu Oct 29 12:03:48 2009
@@ -51,7 +51,30 @@
LogFactory.getLog(JreMemoryLeakPreventionListener.class);
protected static final StringManager sm =
StringManager.getManager(Constants.Package);
-
+
+ /**
+ * Protect against the memory leak caused when the first call to
+ * <code>sun.awt.AppContext.getAppContext()</code> is triggered by a web
+ * application. Defaults to <code>true</code>.
+ */
+ protected boolean appContextProtection = true;
+ public boolean isAppContextProtection() { return appContextProtection; }
+ public void setAppContextProtection(boolean appContextProtection) {
+ this.appContextProtection = appContextProtection;
+ }
+
+ /**
+ * Protect against resources being read for JAR files and, as a
side-effect,
+ * the JAR file becoming locked. Note this disables caching for all
+ * {...@link URLConnection}s, regardless of type. Defaults to
+ * <code>true</code>.
+ */
+ protected boolean urlCacheProtection = true;
+ public boolean isUrlCacheProtection() { return urlCacheProtection; }
+ public void setUrlCacheProtection(boolean urlCacheProtection) {
+ this.urlCacheProtection = urlCacheProtection;
+ }
+
@Override
public void lifecycleEvent(LifecycleEvent event) {
// Initialise these classes when Tomcat starts
@@ -71,7 +94,9 @@
// Trigger a call to sun.awt.AppContext.getAppContext(). This will
// pin the common class loader in memory but that shouldn't be an
// issue.
- ImageIO.getCacheDirectory();
+ if (appContextProtection) {
+ ImageIO.getCacheDirectory();
+ }
/*
* Several components end up opening JarURLConnections without
first
@@ -84,19 +109,21 @@
* - javax.xml.bind.JAXBContext.newInstance()
*/
- // Set the default JAR URL caching policy to not to cache
- try {
- // Doesn't matter that this JAR doesn't exist - just as long as
- // the URL is well-formed
- URL url = new URL("jar:file://dummy.jar!/");
- URLConnection uConn = url.openConnection();
- uConn.setDefaultUseCaches(false);
- } catch (MalformedURLException e) {
- log.error(sm.getString(
- "jreLeakListener.jarUrlConnCacheFail"), e);
- } catch (IOException e) {
- log.error(sm.getString(
- "jreLeakListener.jarUrlConnCacheFail"), e);
+ // Set the default URL caching policy to not to cache
+ if (urlCacheProtection) {
+ try {
+ // Doesn't matter that this JAR doesn't exist - just as
long as
+ // the URL is well-formed
+ URL url = new URL("jar:file://dummy.jar!/");
+ URLConnection uConn = url.openConnection();
+ uConn.setDefaultUseCaches(false);
+ } catch (MalformedURLException e) {
+ log.error(sm.getString(
+ "jreLeakListener.jarUrlConnCacheFail"), e);
+ } catch (IOException e) {
+ log.error(sm.getString(
+ "jreLeakListener.jarUrlConnCacheFail"), e);
+ }
}
}
}
Modified: tomcat/trunk/webapps/docs/config/listeners.xml
URL:
http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/config/listeners.xml?rev=830908&r1=830907&r2=830908&view=diff
==============================================================================
--- tomcat/trunk/webapps/docs/config/listeners.xml (original)
+++ tomcat/trunk/webapps/docs/config/listeners.xml Thu Oct 29 12:03:48 2009
@@ -227,19 +227,36 @@
leak if a web application class loader happens to be the context class
loader at the time. The work-around is to initialise these singletons when
this listener starts as Tomcat's common class loader is the context class
- loader at that time.</p>
+ loader at that time. It also provides work-arounds for known issues that
+ can result in locked JAR files.</p>
- <p>Currently the <strong>JRE Memory Leak Prevention Listener</strong>
- provides work-arounds for the following:</p>
- <ul>
- <li><code>sun.awt.AppContext.getAppContext()</code></li>
- </ul>
-
<p>This listener must only be nested within <a
href="server.html">Server</a>
elements.</p>
- <p>No additional attributes are supported by the <strong>JRE Memory Leak
- Prevention Listener</strong>.</p>
+ <p>The following additional attributes are supported by the <strong>JRE
+ Memory Leak Prevention Listener</strong>:</p>
+
+ <attributes>
+
+ <attribute name="appContextProtection" required="false">
+ <p>Enables protection so that calls to
+ <code>sun.awt.AppContext.getAppContext()</code> triggered by a web
+ application do not result in a memory leak. Note that a call to this
+ method will be triggered as part of the web application stop process so
+ it is strongly recommended that this protection is enabled. The default
+ is <code>true</code></p>
+ </attribute>
+
+ <attribute name="urlCacheProtection" required="false">
+ <p>Enables protection so that reading resources from JAR files using
+ <code>java.net.URLConnection</code>s does not result in the JAR file
+ being locked. Note that enabling this protection disables caching by
+ default for all resources obtained via
+ <code>java.net.URLConnection</code>s. Caching may be re-enabled on a
+ case by case basis is required. Defaults to <code>true</code>.</p>
+ </attribute>
+
+ </attributes>
</subsection>
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]