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]>

Reply via email to