
Tengo un servidor Tomcat 6 en un servidor Ubuntu 12.04 con 4GB y el siguiente JAVA_OPTS
JAVA_OPTS="-Djava.awt.headless=true -Xms512M -Xmx512M -XX:PermSize=1024M -XX:MaxPermSize=1024M -XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled"
Pregunta tonta: si implemento la misma aplicación web (mismo archivo war) varias veces (cada una hace referencia a una base de datos de Postgres diferente), como server.com:8080/webapp1 server.com:8080/webapp2, etc.
¿Puedo suponer que Tomcat almacenará en caché los archivos de clase una vez en las múltiples aplicaciones web? O, ¿Tomcat almacena en caché las clases por aplicación web?
Gracias de antemano danny
Respuesta1
La respuesta depende de dónde haya ubicado los archivos de clase utilizados por su aplicación web.
Si coloca una clase determinada en la ruta del cargador de clases común de Tomcat de $CATALINA_HOME/lib, estará disponible para todas las aplicaciones web. Lo mismo ocurre con su forma almacenada en caché.
Si utiliza la ruta del cargador de clases de la aplicación web Tomcat de webapps/Aplicación Web/WEB-INF/clases y aplicaciones web/Aplicación Web/WEB-INF/lib las clases y los cachés de clases correspondientes están aislados entre aplicaciones.
Experiencia técnica
Tomcat no se ajusta a la forma en que Java procesa clases de forma nativa, pero utiliza un cargador de clases Java personalizado. Esto es para aplicar una serie de características relacionadas con:
- procesamiento de clases dentro de una aplicación web
- almacenamiento en caché de clase por aplicación web
- precarga y recarga de clases en el inicio/tiempo de ejecución de la aplicación web
- seguridad en la carga/referenciación de clases
El cargador de clases personalizado de Tomcat utiliza los cargadores de clases Bootstrap, Extension y System predeterminados de Java, pero sustituye la variable classpath utilizada por el cargador de clases System por su propia classpath. Esto tiene el efecto de:
- reemplazando el mecanismo de anulación de estándares aprobados incluido con Java, por el propio Tomcats.
agregando dos cargadores de clases adicionales al final de la jerarquía de carga de clases de Java:
- El cargador de clases común de Tomcat
- Un cargador de clases separado por aplicación web
Tomcat ignora el classpath original.
Un detalle clave es que un cargador de clases de aplicaciones web no delega primero la carga de clases a sus padres, sino que intenta cargar cada clase según se solicita. Posteriormente, el cargador de clases de la aplicación web en cuestión almacena en caché cada clase cargada. Este nivel de cargador de clases/caché no se puede compartir entre aplicaciones web.
Todas las clases cargadas por el cargador de clases común se ponen a disposición del público para todas las aplicaciones web, incluido el caché. Se desaconseja la colocación extensa de clases en la ruta del cargador de clases común ya que:
- rompe la portabilidad
- Los requisitos de la versión de clase pueden ser diferentes entre Tomcat y diferentes aplicaciones web.
- El mantenimiento se convierte en un problema: ¿qué clase pertenecía a qué?
Hay bastante letra pequeña adjunta al proceso de carga/almacenamiento en caché/recarga de clases. Si eso es importante, mi sugerencia sería leer el capítulo destacado sobre carga de clases en elApache Tomcat profesional 6.
Alguien ha escrito una versión comprimida enestepágina.