Tomcat图书馆渴望加载罐子

时间:2014-08-11 22:56:24

标签: java tomcat web-applications classloader

我在Tomcat server (v7)上部署了两个应用程序,两个应用程序都使用相同的共享库。我想在JVM上减少这些应用程序的permgen内存占用量,所以我决定从单个战争中取出公共共享库并将其放在tomcat library folder中。

然而,这个实验适用于每个应用程序上下文的ClassLoader,即使我将库移动到tomcat lib,共享库也会加载到两个应用程序的上下文中,更糟糕的是它被加载到其他不使用此共享库的应用程序的上下文。

有没有办法在Web服务器的上下文中只加载一次库?

我理解线程安全和安全的风险,这些风险在我的案例中得到了缓解。

1 个答案:

答案 0 :(得分:3)

来自Tomcat lib目录中的jar的类获取自己的类加载器,该加载器在所有已部署的应用程序之间共享。

正如您所指出的,每个应用程序也都拥有自己的类加载器。

此时,了解Tomcat为每个应用程序查找类的位置非常重要。要解释Apache Tomcat Class Loader HOW-TO,应用程序类按以下顺序排列:

  1. JVM引导程序类
  2. 系统类
  3. / WEB-INF /应用程序类
  4. / WEB-INF / lib / * .jar classes
  5. 公共类加载器(在" Tomcat lib"目录中为jar)
  6. 第1,2和2项上面的5是具有自己的存储库的单独的类加载器。第3项和第3项4是单个类加载器,但每个web-app都有一个单独的加载器。

    因此,如果您已将库jar复制到Tomcat lib目录中,而不是从Web应用程序中删除它,那么您仍将在Web应用程序中加载和使用jar。仔细检查部署以确保库jar实际上不再存在于每个应用程序的WEB-INF / lib目录中。