Removing the hardware issues (faulty memory or disk), that you obviously already tested, I'll try to give some directions for testing:

a) Main cause of memory leaks are hard references in main class loader. This happens when you put all your libraries into $TOMCAT_HOME/lib. Try to move your libraries into WEB-INF/lib and check how does your app behave. b) Lots of people forget to correctly close external resources (files, tcp connections, jdbc resources). Check your source code using FindBugs. It is not perfect, but will give you lots of warnings if you run on risk of not correctly closing resources. Remember, for jdbc resources, you should close all result sets first, then all statements, then all connections (not all database drivers will release resultset resources on statement close!). c) Also, we see incorrect thread programming... remember to have a way to signalize to your threads that the application is closing or reloading. In my apps, I have a LifeCicly listener that will notify all threads that they should shutdown immediately. If a thread is stuck using resources, it will remain with that forever... d) If your app is JDK6 compatible, give a try on JRockit VM (from Oracle), and the excellent JRockit Mission Control that helps you to identify problems in real time. e) Never store content in static classes. The references stay forever. If you are using JPA, let JPA implementation to handle the cache. Use Soft Weak or Hard Weak if using EclipseLink. f) Never ever use OneToMany just because it is easy. If you have one object that has OneToMany to other 100, that these has One to many to another 100, you will have 10001 objects in memory with 1 query that is supposed to returns 1 record (the first object). If your query returns 10 records of the first object, you would have 100001 object in memory... If you have 20 users using different objects... well, you got the point, right?

By using good server hardware (ECC memory, SCSI disks, etc), a stable linux distro (my preference is for CentOS 64bit), and following the rules above, I manage to have web apps that run withing 2Gb of memory (on 8Gb of hardware), hundred of users in databases with > 20Gb, 24x7.


I hope this helps,

Edson Richter


Em 31/01/2013 23:36, Zoran Avtarovski escreveu:
Hi Guys,

We have a application running on the latest Tomcat7 and we are getting a
server crash or becoming unresponsive. This occur every few days at no fixed
intervals or time of day and they certainly don't correlate to any app
function ­ at least not according to the logs.

We set setup monitoring using JavaMelody and what we see is dramatic spikes
in CPU and memory usage at the time of the crash.

Memory hovers around 3-5% for the rest of the time and CPU is the same.

I've looked at the number of sessions, HTTP activity , jdbc activity and
nothing obvious jumps out.

I'd really appreciate your collective wisdom in putting into practice some
strategies to identify the cause of the spikes. This driving me and my team
nuts.

Any help would be appreciated.

Z.





---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org
For additional commands, e-mail: users-h...@tomcat.apache.org

Reply via email to