Author: markt
Date: Tue May 29 13:11:51 2012
New Revision: 1343709
URL: http://svn.apache.org/viewvc?rev=1343709&view=rev
Log:
Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=53081
Do not always cache resources loaded by the web application class loader
Modified:
tomcat/tc7.0.x/trunk/ (props changed)
tomcat/tc7.0.x/trunk/java/org/apache/catalina/loader/WebappClassLoader.java
tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml
Propchange: tomcat/tc7.0.x/trunk/
------------------------------------------------------------------------------
Merged /tomcat/trunk:r1343708
Modified:
tomcat/tc7.0.x/trunk/java/org/apache/catalina/loader/WebappClassLoader.java
URL:
http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/catalina/loader/WebappClassLoader.java?rev=1343709&r1=1343708&r2=1343709&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/java/org/apache/catalina/loader/WebappClassLoader.java
(original)
+++ tomcat/tc7.0.x/trunk/java/org/apache/catalina/loader/WebappClassLoader.java
Tue May 29 13:11:51 2012
@@ -2945,6 +2945,7 @@ public class WebappClassLoader
int contentLength = -1;
InputStream binaryStream = null;
+ boolean isClassResource = path.endsWith(".class");
int jarFilesLength = jarFiles.length;
int repositoriesLength = repositories.length;
@@ -3146,7 +3147,20 @@ public class WebappClassLoader
return null;
}
- if (binaryStream != null) {
+ /* Only cache the binary content if there is some content
+ * available and either:
+ * a) It is a class file since the binary content is only
cached
+ * until the class has been loaded
+ * or
+ * b) The file needs conversion to address encoding issues (see
+ * below)
+ *
+ * In all other cases do not cache the content to prevent
+ * excessive memory usage if large resources are present (see
+ * https://issues.apache.org/bugzilla/show_bug.cgi?id=53081).
+ */
+ if (binaryStream != null &&
+ (isClassResource || fileNeedConvert)) {
byte[] binaryContent = new byte[contentLength];
@@ -3248,8 +3262,15 @@ public class WebappClassLoader
if (entry != null) {
if (entry.binaryContent != null)
return new ByteArrayInputStream(entry.binaryContent);
+ else {
+ try {
+ return entry.source.openStream();
+ } catch (IOException ioe) {
+ // Ignore
+ }
+ }
}
- return (null);
+ return null;
}
Modified: tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml
URL:
http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml?rev=1343709&r1=1343708&r2=1343709&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml Tue May 29 13:11:51 2012
@@ -120,6 +120,13 @@
Enable host's xmlBase attribute in ContextConfig. (kfujino)
</fix>
<fix>
+ <bug>53081</bug>: Do not always cache resources loaded by the web
+ application class loader since they may be very large which in turn
+ could trigger a memory leak. Calls to the web application class
+ loader's <code>getResourceAsStream()</code> method will now access
+ the resource directly rather than via the cache in most cases. (markt)
+ </fix>
+ <fix>
<bug>53090</bug>: Include superclasses when considering injection
targets. Patch provided by Borislav Kapukaranov. (markt)
</fix>
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]