
Tenho um servidor Tomcat 6 em um servidor Ubuntu 12.04 com 4GB e o seguinte JAVA_OPTS
JAVA_OPTS="-Djava.awt.headless=true -Xms512M -Xmx512M -XX:PermSize=1024M -XX:MaxPermSize=1024M -XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled"
Pergunta idiota: se eu implantar o mesmo webapp (mesmo arquivo war) várias vezes (cada um faz referência a um banco de dados Postgres diferente) - como server.com:8080/webapp1 server.com:8080/webapp2 etc ...
posso presumir que o Tomcat armazenará em cache os arquivos de classe uma vez em vários aplicativos da web? Ou - o Tomcat armazena em cache classes por Webapp?
Desde já agradeço Dani
Responder1
A resposta depende de onde você localizou os arquivos de classe usados pelo seu webapp.
Se você colocar uma determinada classe no caminho do carregador de classes comum do Tomcat $CATALINA_HOME/lib, ela será disponibilizada para todos os aplicativos da web. O mesmo vale para seu formato em cache.
Se você usar o caminho do carregador de classes do aplicativo da web Tomcat de webapps/aplicativo web/WEB-INF/classes e aplicativos web/aplicativo web/WEB-INF/lib as classes e os caches de classe correspondentes são isolados entre aplicativos.
Formação técnica
O Tomcat não está em conformidade com a maneira como o Java processa classes nativamente, mas usa um carregador de classes Java personalizado. Isso é para impor uma série de recursos relacionados a:
- processamento de classe dentro de um webapp
- cache de classe por webapp
- pré-carregamento e recarregamento de classes na inicialização/tempo de execução do aplicativo web
- segurança no carregamento/referência de classe
O carregador de classes customizado do Tomcat usa os carregadores de classes padrão Java Bootstrap, Extension e System, mas substitui a variável classpath usada pelo carregador de classes System por seu próprio caminho de classe. Isto tem o efeito de:
- substituindo o mecanismo de substituição de padrões endossados fornecido com Java, pelo próprio Tomcats.
adicionando dois carregadores de classes adicionais no final da hierarquia de carregamento de classes Java:
- O carregador de classe comum do Tomcat
- Um carregador de classes separado por webapp
O classpath original é ignorado pelo Tomcat.
Um detalhe importante é que um carregador de classes webapp não delega primeiro o carregamento de classes aos seus pais, mas tenta carregar cada classe conforme solicitado. Cada classe carregada é posteriormente armazenada em cache pelo carregador de classes webapp em questão. Este nível de carregador de classe/cache não pode ser compartilhado entre aplicativos da web.
Todas as classes carregadas pelo carregador de classes Common são disponibilizadas publicamente para todos os aplicativos da web, incluindo o cache. A colocação extensiva de classes no caminho do carregador de classes Common é desencorajada, pois:
- quebra a portabilidade
- os requisitos de versão da classe podem ser diferentes entre o Tomcat e diferentes aplicativos da web.
- a manutenção se torna um problema, qual classe pertencia a quê?
Há muitas letras miúdas anexadas ao processo de carregamento/armazenamento em cache/recarregamento da classe. Se isso for importante, minha sugestão seria ler o excelente capítulo sobre carga de classe noProfissional Apache Tomcat 6.
Uma versão compactada foi escrita por alguém emessepágina.