Author: markt Date: Wed Nov 25 23:56:30 2009 New Revision: 884341 URL: http://svn.apache.org/viewvc?rev=884341&view=rev Log: More memory leak protection. This one is particularly nasty as profilers don't appear to show the GC root associated with the leak.
Modified: tomcat/trunk/java/org/apache/catalina/core/JreMemoryLeakPreventionListener.java tomcat/trunk/java/org/apache/catalina/core/LocalStrings.properties 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=884341&r1=884340&r2=884341&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/core/JreMemoryLeakPreventionListener.java (original) +++ tomcat/trunk/java/org/apache/catalina/core/JreMemoryLeakPreventionListener.java Wed Nov 25 23:56:30 2009 @@ -23,6 +23,8 @@ import java.net.URLConnection; import javax.imageio.ImageIO; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; import org.apache.catalina.Lifecycle; import org.apache.catalina.LifecycleEvent; @@ -75,6 +77,17 @@ this.urlCacheProtection = urlCacheProtection; } + /** + * XML parsing can pin a web application class loader in memory. This is + * particularly nasty as profilers (at least YourKit and Eclispe MAT) don't + * idenitfy any GC roots related to this. + */ + protected boolean xmlParsingProtection = true; + public boolean isXmlParsingProtection() { return xmlParsingProtection; } + public void setXmlParsingProtection(boolean xmlParsingProtection) { + this.xmlParsingProtection = xmlParsingProtection; + } + @Override public void lifecycleEvent(LifecycleEvent event) { // Initialise these classes when Tomcat starts @@ -122,7 +135,23 @@ "jreLeakListener.jarUrlConnCacheFail"), e); } catch (IOException e) { log.error(sm.getString( - "jreLeakListener.jarUrlConnCacheFail"), e); + "jreLeakListener.jarUrlConnCacheFail"), e); + } + } + + /* + * Haven't got to the root of what is going on with this leak but if + * a web app is the first to make the calls below the web + * application class loader will be pinned in memory. + */ + if (xmlParsingProtection) { + DocumentBuilderFactory factory = + DocumentBuilderFactory.newInstance(); + try { + factory.newDocumentBuilder(); + } catch (ParserConfigurationException e) { + log.error(sm.getString( + "jreLeakListener.xmlParseFail"), e); } } } Modified: tomcat/trunk/java/org/apache/catalina/core/LocalStrings.properties URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/LocalStrings.properties?rev=884341&r1=884340&r2=884341&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/core/LocalStrings.properties (original) +++ tomcat/trunk/java/org/apache/catalina/core/LocalStrings.properties Wed Nov 25 23:56:30 2009 @@ -66,6 +66,7 @@ interceptorValve.alreadyStarted=InterceptorValve has already been started interceptorValve.notStarted=InterceptorValve has not yet been started jreLeakListener.jarUrlConnCacheFail=Failed to disable Jar URL connection caching by default +jreLeakListener.xmlParseFail=Error whilst attempting to prevent memory leaks during XML parsing naming.wsdlFailed=Failed to find wsdl file: {0} naming.bindFailed=Failed to bind object: {0} naming.jmxRegistrationFailed=Failed to register in JMX: {0} Modified: tomcat/trunk/webapps/docs/config/listeners.xml URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/config/listeners.xml?rev=884341&r1=884340&r2=884341&view=diff ============================================================================== --- tomcat/trunk/webapps/docs/config/listeners.xml (original) +++ tomcat/trunk/webapps/docs/config/listeners.xml Wed Nov 25 23:56:30 2009 @@ -256,6 +256,13 @@ case by case basis as required. Defaults to <code>true</code>.</p> </attribute> + <attribute name="xmlParsingProtection" required="false"> + <p>Enables protection so that parsing XML files within a web application + does not result in a memopry leak. Note that memory profilers may not + display the GC root associated with this leak making it particularly + hard to diagnose. Defaults to <code>true</code>.</p> + </attribute> + </attributes> </subsection> --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org