Author: markt
Date: Tue Feb 23 23:52:17 2010
New Revision: 915595
URL: http://svn.apache.org/viewvc?rev=915595&view=rev
Log:
More memory leak prevent - ResourceBundle
Modified:
tomcat/tc6.0.x/trunk/ (props changed)
tomcat/tc6.0.x/trunk/STATUS.txt
tomcat/tc6.0.x/trunk/java/org/apache/catalina/loader/LocalStrings.properties
tomcat/tc6.0.x/trunk/java/org/apache/catalina/loader/WebappClassLoader.java
tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml
Propchange: tomcat/tc6.0.x/trunk/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Feb 23 23:52:17 2010
@@ -1,2 +1,2 @@
/tomcat:883362
-/tomcat/trunk:601180,606992,612607,630314,640888,652744,653247,666232,673796,673820,677910,683969,683982,684001,684081,684234,684269-684270,685177,687503,687645,689402,690781,691392,691805,692748,693378,694992,695053,695311,696780,696782,698012,698227,698236,698613,699427,699634,701355,709294,709811,709816,710063,710066,710125,710205,711126,711600,712461,712467,713953,714002,718360,719119,719124,719602,719626,719628,720046,720069,721040,721286,721708,721886,723404,723738,726052,727303,728032,728768,728947,729057,729567,729569,729571,729681,729809,729815,729934,730250,730590,731651,732859,732863,734734,740675,740684,742677,742697,742714,744160,744238,746321,746384,746425,747834,747863,748344,750258,750291,750921,751286-751287,751289,751295,752323,753039,757335,757774,758249,758365,758596,758616,758664,759074,761601,762868,762929,762936-762937,763166,763183,763193,763228,763262,763298,763302,763325,763599,763611,763654,763681,763706,764985,764997,765662,768335,769979,770716,77
0809,770876,772872,776921,776924,776935,776945,777464,777466,777576,777625,778379,778523-778524,781528,781779,782145,782791,783316,783696,783724,783756,783762,783766,783863,783934,784453,784602,784614,785381,785688,785768,785859,786468,786487,786490,786496,786667,787627,787770,787985,789389,790405,791041,791184,791194,791224,791243,791326,791328,791789,792740,793372,793757,793882,793981,794082,794673,794822,795043,795152,795210,795457,795466,797168,797425,797596,797607,802727,802940,804462,804544,804734,805153,809131,809603,810916,810977,812125,812137,812432,813001,813013,813866,814180,814708,814876,815972,816252,817442,817822,819339,819361,820110,820132,820874,820954,821397,828196,828201,828210,828225,828759,830378-830379,830999,831106,831774,831785,831828,831850,831860,832214,832218,833121,833545,834047,835036,835336,836405,881396,881412,883130,883134,883146,883165,883177,883362,883565,884341,885038,885231,885241,885260,885901,885991,886019,888072,889363,889606,889716,8901
39,890265,890349-890350,890417,891185-891187,891583,892198,892341,892415,892464,892555,892812,892814,892817,892843,892887,893321,893493,894580,894586,894805,894831,895013,895045,895057,895191,895392,895703,896370,896384,897380-897381,897776,898126,898256,898468,898527,898555,898558,898718,898836,898906,899284,899348,899420,899653,899769-899770,899783,899788,899792,899916,899918-899919,899935,899949,903916,905020,905151,905722,905728,905735,907311,907513,907538,907652,907819,907825,907864,908721,908754,908759,909636,909875,910442,910471
+/tomcat/trunk:601180,606992,612607,630314,640888,652744,653247,666232,673796,673820,677910,683969,683982,684001,684081,684234,684269-684270,685177,687503,687645,689402,690781,691392,691805,692748,693378,694992,695053,695311,696780,696782,698012,698227,698236,698613,699427,699634,701355,709294,709811,709816,710063,710066,710125,710205,711126,711600,712461,712467,713953,714002,718360,719119,719124,719602,719626,719628,720046,720069,721040,721286,721708,721886,723404,723738,726052,727303,728032,728768,728947,729057,729567,729569,729571,729681,729809,729815,729934,730250,730590,731651,732859,732863,734734,740675,740684,742677,742697,742714,744160,744238,746321,746384,746425,747834,747863,748344,750258,750291,750921,751286-751287,751289,751295,752323,753039,757335,757774,758249,758365,758596,758616,758664,759074,761601,762868,762929,762936-762937,763166,763183,763193,763228,763262,763298,763302,763325,763599,763611,763654,763681,763706,764985,764997,765662,768335,769979,770716,77
0809,770876,772872,776921,776924,776935,776945,777464,777466,777576,777625,778379,778523-778524,781528,781779,782145,782791,783316,783696,783724,783756,783762,783766,783863,783934,784453,784602,784614,785381,785688,785768,785859,786468,786487,786490,786496,786667,787627,787770,787985,789389,790405,791041,791184,791194,791224,791243,791326,791328,791789,792740,793372,793757,793882,793981,794082,794673,794822,795043,795152,795210,795457,795466,797168,797425,797596,797607,802727,802940,804462,804544,804734,805153,809131,809603,810916,810977,812125,812137,812432,813001,813013,813866,814180,814708,814876,815972,816252,817442,817822,819339,819361,820110,820132,820874,820954,821397,828196,828201,828210,828225,828759,830378-830379,830999,831106,831774,831785,831828,831850,831860,832214,832218,833121,833545,834047,835036,835336,836405,881396,881412,883130,883134,883146,883165,883177,883362,883565,884341,885038,885231,885241,885260,885901,885991,886019,888072,889363,889606,889716,8901
39,890265,890349-890350,890417,891185-891187,891583,892198,892341,892415,892464,892555,892812,892814,892817,892843,892887,893321,893493,894580,894586,894805,894831,895013,895045,895057,895191,895392,895703,896370,896384,897380-897381,897776,898126,898256,898468,898527,898555,898558,898718,898836,898906,899284,899348,899420,899653,899769-899770,899783,899788,899792,899916,899918-899919,899935,899949,903916,905020,905151,905722,905728,905735,907311,907513,907538,907652,907819,907825,907864,908721,908754,908759,909097,909525,909636,909875,910442,910471
Modified: tomcat/tc6.0.x/trunk/STATUS.txt
URL:
http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/STATUS.txt?rev=915595&r1=915594&r2=915595&view=diff
==============================================================================
--- tomcat/tc6.0.x/trunk/STATUS.txt (original)
+++ tomcat/tc6.0.x/trunk/STATUS.txt Tue Feb 23 23:52:17 2010
@@ -119,14 +119,6 @@
http://tools.ietf.org/html/rfc2616
-* More memory leak prevent - ResourceBundle
- http://svn.apache.org/viewvc?rev=909097&view=rev (original)
- http://svn.apache.org/viewvc?rev=909525&view=rev (improvements)
- +1: markt, kkolinko, fhanik
- -1:
- kkolinko: Calling ResourceBundle.clearCache(CL) would work on any Java
- 6+ JVM, not only Sun's
-
* Improvements for WebappClassLoader#clearThreadLocalMap:
http://svn.apache.org/viewvc?rev=908002&view=rev
http://svn.apache.org/viewvc?rev=909206&view=rev
Modified:
tomcat/tc6.0.x/trunk/java/org/apache/catalina/loader/LocalStrings.properties
URL:
http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/catalina/loader/LocalStrings.properties?rev=915595&r1=915594&r2=915595&view=diff
==============================================================================
---
tomcat/tc6.0.x/trunk/java/org/apache/catalina/loader/LocalStrings.properties
(original)
+++
tomcat/tc6.0.x/trunk/java/org/apache/catalina/loader/LocalStrings.properties
Tue Feb 23 23:52:17 2010
@@ -34,6 +34,8 @@
webappClassLoader.stopped=Illegal access: this web application instance has
been stopped already. Could not load {0}. The eventual following stack trace
is caused by an error thrown for debugging purposes as well as to attempt to
terminate the thread which caused the illegal access, and has no functional
impact.
webappClassLoader.readError=Resource read error: Could not load {0}.
webappClassLoader.clearJbdc=A web application registered the JBDC driver [{0}]
but failed to unregister it when the web application was stopped. To prevent a
memory leak, the JDBC Driver has been forcibly unregistered.
+webappClassLoader.clearReferencesResourceBundlesCount=Removed [{0}]
ResourceBundle references from the cache
+webappClassLoader.clearReferencesResourceBundlesFail=Failed to clear
ResourceBundle references
webappClassLoader.clearRmiInfo=Failed to find class sun.rmi.transport.Target
to clear context class loader. This is expected on non-Sun JVMs.
webappClassLoader.clearRmiFail=Failed to clear context class loader referenced
from sun.rmi.transport.Target
webappClassLoader.clearThreadLocal=A web application created a ThreadLocal
with key of type [{0}] (value [{1}]) and a value of type [{2}] (value [{3}])
but failed to remove it when the web application was stopped. To prevent a
memory leak, the ThreadLocal has been forcibly removed.
Modified:
tomcat/tc6.0.x/trunk/java/org/apache/catalina/loader/WebappClassLoader.java
URL:
http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/catalina/loader/WebappClassLoader.java?rev=915595&r1=915594&r2=915595&view=diff
==============================================================================
--- tomcat/tc6.0.x/trunk/java/org/apache/catalina/loader/WebappClassLoader.java
(original)
+++ tomcat/tc6.0.x/trunk/java/org/apache/catalina/loader/WebappClassLoader.java
Tue Feb 23 23:52:17 2010
@@ -25,6 +25,7 @@
import java.io.IOException;
import java.io.InputStream;
import java.lang.ref.Reference;
+import java.lang.ref.WeakReference;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
@@ -47,7 +48,8 @@
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
-import java.util.TimerTask;
+import java.util.ResourceBundle;
+import java.util.Set;
import java.util.Vector;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.jar.Attributes;
@@ -66,6 +68,7 @@
import org.apache.catalina.LifecycleException;
import org.apache.catalina.LifecycleListener;
import org.apache.catalina.util.StringManager;
+import org.apache.jasper.servlet.JasperLoader;
import org.apache.naming.JndiPermission;
import org.apache.naming.resources.Resource;
import org.apache.naming.resources.ResourceAttributes;
@@ -1755,6 +1758,13 @@
org.apache.juli.logging.LogFactory.release(this);
}
+ // Clear the resource bundle cache
+ // This shouldn't be necessary, the cache uses weak references but
+ // it has caused leaks. Oddly, using the leak detection code in
+ // standard host allows the class loader to be GC'd. This has been seen
+ // on Sun but not IBM JREs. Maybe a bug in Sun's GC impl?
+ clearReferencesResourceBundles();
+
// Clear the classloader reference in the VM's bean introspector
java.beans.Introspector.flushCaches();
@@ -2287,6 +2297,88 @@
/**
+ * Clear the {...@link ResourceBundle} cache of any bundles loaded by this
+ * class loader or any class loader where this loader is a parent class
+ * loader. Whilst {...@link ResourceBundle#clearCache()} could be used
there
+ * are complications around the {...@link JasperLoader} that mean a
reflection
+ * based approach is more likely to be complete.
+ *
+ * The ResourceBundle is using WeakReferences so it shouldn't be pinning
the
+ * class loader in memory. However, it is. Therefore clear ou the
+ * references.
+ */
+ private void clearReferencesResourceBundles() {
+ // Get a reference to the cache
+ try {
+ Field cacheListField =
+ ResourceBundle.class.getDeclaredField("cacheList");
+ cacheListField.setAccessible(true);
+
+ // Java 6 uses ConcurrentMap
+ // Java 5 uses SoftCache extends Abstract Map
+ // So use Map and it *should* work with both
+ Map<?,?> cacheList = (Map<?,?>) cacheListField.get(null);
+
+ // Get the keys (loader references are in the key)
+ Set<?> keys = cacheList.keySet();
+
+ Field loaderRefField = null;
+
+ // Iterate over the keys looking at the loader instances
+ Iterator<?> keysIter = keys.iterator();
+
+ int countRemoved = 0;
+
+ while (keysIter.hasNext()) {
+ Object key = keysIter.next();
+
+ if (loaderRefField == null) {
+ loaderRefField =
+ key.getClass().getDeclaredField("loaderRef");
+ loaderRefField.setAccessible(true);
+ }
+ WeakReference<?> loaderRef =
+ (WeakReference<?>) loaderRefField.get(key);
+
+ ClassLoader loader = (ClassLoader) loaderRef.get();
+
+ while (loader != null && loader != this) {
+ loader = loader.getParent();
+ }
+
+ if (loader != null) {
+ keysIter.remove();
+ countRemoved++;
+ }
+ }
+
+ if (countRemoved > 0 && log.isDebugEnabled()) {
+ log.debug(sm.getString(
+
"webappClassLoader.clearReferencesResourceBundlesCount",
+ Integer.valueOf(countRemoved)));
+ }
+ } catch (SecurityException e) {
+ log.error(sm.getString(
+ "webappClassLoader.clearReferencesResourceBundlesFail"),
e);
+ } catch (NoSuchFieldException e) {
+ if (System.getProperty("java.vendor").startsWith("Sun")) {
+ log.error(sm.getString(
+ "webappClassLoader.clearReferencesResourceBundlesFail"), e);
+ } else {
+ log.debug(sm.getString(
+ "webappClassLoader.clearReferencesResourceBundlesFail"), e);
+ }
+ } catch (IllegalArgumentException e) {
+ log.error(sm.getString(
+ "webappClassLoader.clearReferencesResourceBundlesFail"),
e);
+ } catch (IllegalAccessException e) {
+ log.error(sm.getString(
+ "webappClassLoader.clearReferencesResourceBundlesFail"),
e);
+ }
+ }
+
+
+ /**
* Determine whether a class was loaded by this class loader or one of
* its child class loaders.
*/
Modified: tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml
URL:
http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml?rev=915595&r1=915594&r2=915595&view=diff
==============================================================================
--- tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml Tue Feb 23 23:52:17 2010
@@ -101,7 +101,8 @@
<add>
Improve memory leak protection by safely stopping threads started via
<code>java.util.Timer</code> that an application starts but fails to
- stop. (markt)
+ stop and by clearing references retained due to the use of
+ <code>java.util.ResourceBundle</code>. (markt)
</add>
</changelog>
</subsection>
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]