hi,
I'm experiencing memory problems with Tomcat as a Standalone Server.
(this must have popped up somewhere before, but I could not find it in the
bugbase or mailing archives.)
I see the problem under those settings:
Linux / Sun JVM 1.2.2_06 / Tomcat 4.0.1 rel.
Linux / Sun JVM 1.4.0 / Tomcat 4.1 current cvs
My application dynamically creates (lots of) jpg files in a webapp's subdir.
The client(s) access these (HTTP/GET) once. after that, the jpg is useless
and gets deleted after a certain amount of time.
Each GET consumes a considerable amount of memory (around 12k) within Tomcat
which is not freed until Tomcat is shut down.
Running my stress test application (which was intended for stressing _my_
application) results in a Tomcat uptime of less than five hours with max heap
I can do on this box (256M). this is very bad scalability.
Tomcat goes dark with trace logs like those attached at the end of my email.
It appears (but is not measured) that the problem has something to do with
the size of the JPGs: The bigger the JPG, the more memory is consumed at each
request.
I looked into the current Tomcat code and measured some things but did not
find the hotspot. DefaultServlet (esp. serveResource(), copyRange()) is used
everytime a JPG is loaded but it seems to be ok, the BufferedXXXStreams seem
to be fine.
Possible workarounds:
- Access the jpgs via file-protocol -> only possible on local host. but
leaves Tomcat memory constant. (as expected. tomcat is doing nothing then.)
- Using apache for serving the jpgs -> ok, but the nasty scalability problem
in Tomcat would stay, my setting would completly change.
I read a brief remark in a posting (by Remy Maucherat?) that static
fileserving is an issue and associated code is currently rewritten.
My questions:
- is this scalability issue known and is there a prospect of a fix?
- can you point out the cause for my problem (i.e. where to look at in the
Tomcat code or which objects eat all that memory)?
- can i help out with testing as soon as a the issue is tracked down?
I've dumped the heap but as I'm not familiar with Tomcat interns I see
nothing from that (can you?).
thanks,
bernd
----------------
Stack #1:
java.lang.OutOfMemoryError:
at java.io.BufferedInputStream.<init>(BufferedInputStream.java:155)
at org.apache.catalina.servlets.DefaultServlet.copy(DefaultServlet.java:1638)
at
org.apache.catalina.servlets.DefaultServlet.serveResource(DefaultServlet.java:1194)
at org.apache.catalina.servlets.DefaultServlet.doGet(DefaultServlet.java:519)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:740)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247)
at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)
at
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:243)
at
org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
at
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:201)
at
org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2344)
at
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
at
org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
at
org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:170)
at
org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
at
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:170)
at
org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:462)
at
org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
at
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:163)
at
org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
at
org.apache.catalina.connector.http.HttpProcessor.process(HttpProcessor.java:1011)
at
org.apache.catalina.connector.http.HttpProcessor.run(HttpProcessor.java:1106)
at java.lang.Thread.run(Thread.java:475)
Stack #2:
java.lang.OutOfMemoryError:
at java.io.OutputStreamWriter.<init>(OutputStreamWriter.java:99)
at java.io.OutputStreamWriter.<init>(OutputStreamWriter.java:74)
at
org.apache.catalina.connector.HttpResponseBase.sendHeaders(HttpResponseBase.java:571)
at
org.apache.catalina.connector.HttpResponseBase.flushBuffer(HttpResponseBase.java:739)
at org.apache.catalina.connector.ResponseBase.write(ResponseBase.java:652)
at
org.apache.catalina.connector.ResponseStream.write(ResponseStream.java:312)
at
org.apache.catalina.connector.http.HttpResponseStream.write(HttpResponseStream.java:175)
at
org.apache.catalina.servlets.DefaultServlet.copyRange(DefaultServlet.java:1893)
at org.apache.catalina.servlets.DefaultServlet.copy(DefaultServlet.java:1642)
at
org.apache.catalina.servlets.DefaultServlet.serveResource(DefaultServlet.java:1194)
at org.apache.catalina.servlets.DefaultServlet.doGet(DefaultServlet.java:519)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:740)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247)
at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)
at
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:243)
at
org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
at
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:201)
at
org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2344)
at
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
at
org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
at
org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:170)
at
org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
at
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:170)
at
org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:462)
at
org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
at
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:163)
at
org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
at
org.apache.catalina.connector.http.HttpProcessor.process(HttpProcessor.java:1011)
at
org.apache.catalina.connector.http.HttpProcessor.run(HttpProcessor.java:1106)
at java.lang.Thread.run(Thread.java:475)
--
To unsubscribe: <mailto:[EMAIL PROTECTED]>
For additional commands: <mailto:[EMAIL PROTECTED]>
Troubles with the list: <mailto:[EMAIL PROTECTED]>