Hi,

We are experiencing OutOfMemory errors which could be linked to
Tomcat keeping objects in memory about past transactions or
clients.

We're working on migrating an application from IPlanet to Tomcat.

Everything works great in our testing lab, but if we add it in
the load balancer pool alongside our live servers it eventually
exhausts all memory from its heap.

Our java options are "-Xms 704m -Xms704m". We're capturing free
heap size at short intervals and monitoring this over time. To
make the measurement more relevant to live objects, we're calling
the garbage collector explicitly every 5mn.

At process start-up, 200MB of the heap is in use.

We've conducted the following experiments:
- if we keep sending traffic, heap usage will grow up to the
maximum, then throw OutOfMemory errors. This can happen after 1~2
hours of traffic. The more load we apply, the faster we get to
the breaking point.
- if we stop sending traffic to it before it gets too close to
run out of memory, memory usage goes back down over time to
200MB. So what we're seeing is not a memory leak in the sense
that whatever objects are filling up the heap do eventually die
and get garbage collected. But they take a long time to die:
100MB of objects are recovered in the first few minutes without
traffic, but it then takes up to 2 hours for the process to get
back to its 200MB heap usage.
- after the memory usage has gone down like this, we can start
sending traffic again, and heap memory usage will again increase
towards the maximum, until either it runs out of memory or we
take it offline and memory usage falls back down.

This looks like something is keeping around objects linked to
past transactions or connections. Our application is not supposed
to keep state about past transactions, and doesn't exhibit this
behaviour when running in IPlanet. Also, this doesn't happen in
the testing lab, where the client IP addresses set is very
limited. So I am wondering whether any part of Tomcat could be
keeping objects on a per-client basis even after connections have
been closed.

Our application doesn't use sessions, but just to make sure we
modified server.xml to specify a 1mn expiration on the
StandardManager. We had access logging enabled (lookups
disabled), but also disabled that.

We've seen this using both Sun's 1.4.1 jdk and IBM's 1.3.1 jre.
We are considering upgrading to 4.1.12, but don't know whether
this will fix the problem.

We're also going to run it with "-verbose:gc", and see whether it
gives us any additional information.

Does anyone know what this could be, whether it affects 4.1.12
too, or how to work around it ?

Any help is greatly appreciated. Thanks,

Seb






--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to