On 25/11/2009, ma...@apache.org <ma...@apache.org> wrote:
> 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;

The variable should be private, as there are public get/set methods.

>  +    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
>
>

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

Reply via email to