From: markt Date: Fri, 17 Jul 2009 17:19:59 +0000 (+0000) Subject: Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=41059 X-Git-Url: https://git.internetallee.de/?a=commitdiff_plain;h=ad2e11810eec739a663b6f910f7480c5868b3690;p=tomcat7.0 Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=41059 Reduce one possible source of errors if using ENABLE_CLEAR_REFERENCES=true Patch by Curt Arnold git-svn-id: https://svn.apache.org/repos/asf/tomcat/trunk@795152 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/java/org/apache/catalina/loader/WebappClassLoader.java b/java/org/apache/catalina/loader/WebappClassLoader.java index 8fc486821..26c9e575a 100644 --- a/java/org/apache/catalina/loader/WebappClassLoader.java +++ b/java/org/apache/catalina/loader/WebappClassLoader.java @@ -1653,7 +1653,31 @@ public class WebappClassLoader // Null out any static or final fields from loaded classes, // as a workaround for apparent garbage collection bugs if (ENABLE_CLEAR_REFERENCES) { - Iterator loadedClasses = ((HashMap) resourceEntries.clone()).values().iterator(); + java.util.Collection values = + ((HashMap) resourceEntries.clone()).values(); + Iterator loadedClasses = values.iterator(); + // + // walk through all loaded class to trigger initialization for + // any uninitialized classes, otherwise initialization of + // one class may call a previously cleared class. + while(loadedClasses.hasNext()) { + ResourceEntry entry = loadedClasses.next(); + if (entry.loadedClass != null) { + Class clazz = entry.loadedClass; + try { + Field[] fields = clazz.getDeclaredFields(); + for (int i = 0; i < fields.length; i++) { + if(Modifier.isStatic(fields[i].getModifiers())) { + fields[i].get(null); + break; + } + } + } catch(Throwable t) { + // Ignore + } + } + } + loadedClasses = values.iterator(); while (loadedClasses.hasNext()) { ResourceEntry entry = loadedClasses.next(); if (entry.loadedClass != null) {