我有一个Ubuntu 12.04服务器上的Tomcat 6服务器与4GB和以下JAVA_OPTS
JAVA_OPTS =“ – Djava.awt.headless = true -Xms512M -Xmx512M -XX:PermSize = 1024M -XX:MaxPermSize = 1024M -XX:+ CMSClassUnloadingEnabled -XX:+ CMSPermGenSweepingEnabled”
愚蠢的问题:如果我部署相同的Web应用程序(相同的战争文件)几次(每个引用不同的Postgres数据库) – 作为server.com:8080/webapp1 server.com:8080/webapp2等…
我可以假设Tomcat会在多个webapps上caching类文件吗? 或者 – 每个Web应用程序Tomcatcaching类?
在此先感谢丹尼
答案取决于你的web应用使用的类文件的位置。
如果将给定的类放在$ CATALINA_HOME / lib的Tomcat Common类加载器path中,则它将可用于所有的webapps。 其cachingforms也是如此。
如果使用webapps / webapp / WEB-INF / classes和webapps / webapp / WEB-INF / lib的Tomcat Web应用程序类加载器path,则应用程序之间会隔离类和相应的类caching。
技术背景
Tomcat不符合Java本身处理类的方式,而是使用定制的Java类加载器。这是为了执行一些与以下相关的function:
Tomcat自定义类加载器使用Java默认的Bootstrap,Extension和System类加载器,但将System类加载器使用的classpathvariablesreplace为自己的类path。 这具有以下效果:
在Java类加载层次结尾添加两个额外的类加载器:
原来的类path被Tomcat忽略。
关键的细节是,webapp类加载器不会首先将类加载委托给父类,但会尝试按请求加载每个类。 每个加载的类随后都被有问题的webapp类加载器caching。 这个类加载器/caching级别不能在webapps之间共享。
通用类加载器加载的所有类都可以公开提供给所有的web应用程序,包括caching。 不鼓励在通用类加载器path中广泛放置类:
类加载/caching/重装过程中有相当多的精细打印。 如果这很重要,我的build议是阅读专业Apache Tomcat 6中有关类加载的杰出章节。
压缩版本是由本页面上的某人撰写的。