A mi me ha pasado muchas veces que al cuarto o quinto despliegue en Tomcat, saltan excepciones del tipo PermGen OutOfMemoryError.
Gracias a mi red en del.icio.us , he encontrado una posible solucion añadiendo los siguientes parametros a la maquina virtual que ejecuta Tomcat (o el contenedor J2EE que tengas):
-XX:+UseConcMarkSweepGC -XX:+CMSPermGenSweepingEnabled -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=128m



Creo que has solucionado el efecto, no el origen.
Claro que si te quedas sin memoria, aumentar el limite de la posible asignada hará que desaparezca el problema.
Pero creo que la causa real esta en la NO reinicialización del servidor durante los sucesivos despliegues que en desarrollo se hacen.
Reiniciar el servidor (costoso en tiempo y en clicks, claro) creo que seria la autentica solucion, pues el problema en producción no deberia producirse.
El problema esta en que el tomcat no libera el permsize cuando recargas las aplicaciones. ¿Que es esto de permsize? La máquina virtual, divide la memoria en distintas partes, una de ellas es el permsize, que se encarga de almacenar las clases. Y digo clases no objetos.
Cuando recargamos el tomcat vamos llenando ese espacio hasta que acaba llenandose. Como bien dice Juan, no hay solución, si no te la quieres jugar de vez en cuando reinicia el tomcat.
Te aconsejo que instales lambdaprobe.com en tus tomcats para que puedas visualizar como de lleno esta el permsize, para así estar algo más seguro de si es un bueno momento de matar el tomcat o recargar la aplicación.
Saludos¡¡
De eso se trata, de solucionar el problema en desarrollo. Si leeis la explicacion a esta posible solucion vereis que tiene sentido. Hace correr un segundo garbage collector (UseConcMarkSweepGC) para limpiar aquellas instancias permanentes en memoria debido a la no reiniciacion de Tomcat.
No pongo la mano en el fuego porque no tengo muy estudiado el sistema de memoria de Java, pero desde que he puesto estos parametros no he visto un PermGen OutOfMemoryError.