Author: markt Date: Thu Apr 19 20:19:12 2007 New Revision: 530625 URL: http://svn.apache.org/viewvc?view=rev&rev=530625 Log: Fix bug 41939 by porting the TC6 configuration option for clearing static and final fields from loaded classes.
Modified: tomcat/container/tc5.5.x/catalina/src/share/org/apache/catalina/loader/WebappClassLoader.java tomcat/container/tc5.5.x/webapps/docs/changelog.xml Modified: tomcat/container/tc5.5.x/catalina/src/share/org/apache/catalina/loader/WebappClassLoader.java URL: http://svn.apache.org/viewvc/tomcat/container/tc5.5.x/catalina/src/share/org/apache/catalina/loader/WebappClassLoader.java?view=diff&rev=530625&r1=530624&r2=530625 ============================================================================== --- tomcat/container/tc5.5.x/catalina/src/share/org/apache/catalina/loader/WebappClassLoader.java (original) +++ tomcat/container/tc5.5.x/catalina/src/share/org/apache/catalina/loader/WebappClassLoader.java Thu Apr 19 20:19:12 2007 @@ -112,6 +112,9 @@ protected static org.apache.commons.logging.Log log= org.apache.commons.logging.LogFactory.getLog( WebappClassLoader.class ); + public static final boolean ENABLE_CLEAR_REFERENCES = + Boolean.valueOf(System.getProperty("org.apache.catalina.loader.WebappClassLoader.ENABLE_CLEAR_REFERENCES", "true")).booleanValue(); + protected class PrivilegedFindResource implements PrivilegedAction { @@ -1589,46 +1592,48 @@ // 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(); - while (loadedClasses.hasNext()) { - ResourceEntry entry = (ResourceEntry) loadedClasses.next(); - if (entry.loadedClass != null) { - Class clazz = entry.loadedClass; - try { - Field[] fields = clazz.getDeclaredFields(); - for (int i = 0; i < fields.length; i++) { - Field field = fields[i]; - int mods = field.getModifiers(); - if (field.getType().isPrimitive() - || (field.getName().indexOf("$") != -1)) { - continue; - } - if (Modifier.isStatic(mods)) { - try { - field.setAccessible(true); - if (Modifier.isFinal(mods)) { - if (!((field.getType().getName().startsWith("java.")) - || (field.getType().getName().startsWith("javax.")))) { - nullInstance(field.get(null)); + if (ENABLE_CLEAR_REFERENCES) { + Iterator loadedClasses = ((HashMap) resourceEntries.clone()).values().iterator(); + while (loadedClasses.hasNext()) { + ResourceEntry entry = (ResourceEntry) loadedClasses.next(); + if (entry.loadedClass != null) { + Class clazz = entry.loadedClass; + try { + Field[] fields = clazz.getDeclaredFields(); + for (int i = 0; i < fields.length; i++) { + Field field = fields[i]; + int mods = field.getModifiers(); + if (field.getType().isPrimitive() + || (field.getName().indexOf("$") != -1)) { + continue; + } + if (Modifier.isStatic(mods)) { + try { + field.setAccessible(true); + if (Modifier.isFinal(mods)) { + if (!((field.getType().getName().startsWith("java.")) + || (field.getType().getName().startsWith("javax.")))) { + nullInstance(field.get(null)); + } + } else { + field.set(null, null); + if (log.isDebugEnabled()) { + log.debug("Set field " + field.getName() + + " to null in class " + clazz.getName()); + } } - } else { - field.set(null, null); + } catch (Throwable t) { if (log.isDebugEnabled()) { - log.debug("Set field " + field.getName() - + " to null in class " + clazz.getName()); + log.debug("Could not set field " + field.getName() + + " to null in class " + clazz.getName(), t); } } - } catch (Throwable t) { - if (log.isDebugEnabled()) { - log.debug("Could not set field " + field.getName() - + " to null in class " + clazz.getName(), t); - } } } - } - } catch (Throwable t) { - if (log.isDebugEnabled()) { - log.debug("Could not clean fields for class " + clazz.getName(), t); + } catch (Throwable t) { + if (log.isDebugEnabled()) { + log.debug("Could not clean fields for class " + clazz.getName(), t); + } } } } Modified: tomcat/container/tc5.5.x/webapps/docs/changelog.xml URL: http://svn.apache.org/viewvc/tomcat/container/tc5.5.x/webapps/docs/changelog.xml?view=diff&rev=530625&r1=530624&r2=530625 ============================================================================== --- tomcat/container/tc5.5.x/webapps/docs/changelog.xml (original) +++ tomcat/container/tc5.5.x/webapps/docs/changelog.xml Thu Apr 19 20:19:12 2007 @@ -60,6 +60,13 @@ <bug>41655</bug> Fix message translations. Japanese translations provided by Suzuki Yuichiro. (markt) </fix> + <fix> + <bug>41939</bug> Add configuration option to disable nulling of static + and final fields of loaded classes when stopping a web application + classloader. Setting the system property + org.apache.catalina.loader.WebappClassLoader.ENABLE_CLEAR_REFERENCES to + false will stop these fields being set to null on context stop. (markt) + </fix> </changelog> </subsection> <subsection name="Webapps"> --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]