Index: .classpath =================================================================== --- .classpath (revision 488761) +++ .classpath (working copy) @@ -12,7 +12,7 @@ - + Index: catalina/src/share/org/apache/catalina/core/StandardContext.java =================================================================== --- catalina/src/share/org/apache/catalina/core/StandardContext.java (revision 488761) +++ catalina/src/share/org/apache/catalina/core/StandardContext.java (working copy) @@ -178,7 +178,10 @@ */ private boolean antiJARLocking = false; - + /** + * The nullifyReferences flag for this Context. + */ + private boolean nullifyReferences = true; /** * The antiResourceLocking flag for this Context. */ @@ -875,7 +878,23 @@ return (this.antiResourceLocking); } + /** + * @param flag The nullInstanceFields to set. + */ + public void setNullifyReferences(boolean flag) { + boolean oldNullInstanceFields = this.nullifyReferences; + this.nullifyReferences = flag; + support.firePropertyChange("nullifyReferences", + new Boolean(oldNullInstanceFields), + new Boolean(this.nullifyReferences)); + } + /** + * @return Returns the nullInstanceFields. + */ + public boolean getNullifyReferences() { + return nullifyReferences; + } /** * Set the antiJARLocking feature for this Context. Index: catalina/src/share/org/apache/catalina/loader/WebappLoader.java =================================================================== --- catalina/src/share/org/apache/catalina/loader/WebappLoader.java (revision 488761) +++ catalina/src/share/org/apache/catalina/loader/WebappLoader.java (working copy) @@ -667,9 +667,10 @@ classLoader = createClassLoader(); classLoader.setResources(container.getResources()); classLoader.setDelegate(this.delegate); - if (container instanceof StandardContext) + if (container instanceof StandardContext){ classLoader.setAntiJARLocking(((StandardContext) container).getAntiJARLocking()); - + classLoader.setNullifyReferences(((StandardContext) container).getNullifyReferences()); + } for (int i = 0; i < repositories.length; i++) { classLoader.addRepository(repositories[i]); } Index: catalina/src/share/org/apache/catalina/loader/WebappClassLoader.java =================================================================== --- catalina/src/share/org/apache/catalina/loader/WebappClassLoader.java (revision 488761) +++ catalina/src/share/org/apache/catalina/loader/WebappClassLoader.java (working copy) @@ -168,6 +168,11 @@ */ boolean antiJARLocking = false; + /** + * Set static fields of loaded classes to null when undeploying to prevent + * memory leaks. + */ + boolean nullifyReferences = true; // ----------------------------------------------------------- Constructors @@ -424,15 +429,29 @@ return antiJARLocking; } - - /** + /** * @param antiJARLocking The antiJARLocking to set. */ public void setAntiJARLocking(boolean antiJARLocking) { this.antiJARLocking = antiJARLocking; } + + /** + * @param flag The nullifyReferences to set. + */ + public void setNullifyReferences(boolean flag) { + this.nullifyReferences = flag; + } + /** + * @return Returns the nullifyReferences. + */ + public boolean getNullifyReferences() { + return nullifyReferences; + } + + /** * If there is a Java SecurityManager create a read FilePermission * or JndiPermission for the file directory path. @@ -1587,6 +1606,7 @@ } } + if(nullifyReferences) { // Null out any static or final fields from loaded classes, // as a workaround for apparent garbage collection bugs Iterator loadedClasses = ((HashMap) resourceEntries.clone()).values().iterator(); @@ -1633,7 +1653,7 @@ } } } - + } // Remove entries for this webapp from the JSP EL BeanInfo cache cleanElCache();