在tomcat上部署应用程序时加载的类太多

时间:2012-10-02 10:42:57

标签: java tomcat profiling classloader

我们有一个网络应用程序,它依赖于大约125个罐子,包括spring,hibernet,zk等。

当我们启动tomcat服务器时,它会将大约55K个类加载到permgen中。由于这个巨大的类加载,应用程序启动需要大量的时间。此外,应用程序所需的permgen空间非常高,因为在程序执行期间也会加载其他类。

  • 有没有办法控制启动时加载了多少个类,以便快速启动应用程序?
  • 有没有办法从permgen免费/卸载不经常使用的类? [这些问题特定于从外部罐子加载的类]

我曾尝试使用-XX:+ CMSClassUnloadingEnabled -XX:+为CM指定的CMSPermGenSweepingEnabled选项。但是在一段时间后只卸载了42个班级。

非常感谢任何帮助或指示。

2 个答案:

答案 0 :(得分:0)

罐子在类路径中是有原因的。它们可能是通过构建管理系统(maven,gradle,...)添加到webapp中的 - 因此可能存在对这些jar的依赖。

从类路径中删除jar将生成NoClassDefFoundError。我想你必须忍受那些罐子,除非不需要其中一些(这不容易找到)。

最好检查您的依赖图(maven和gradle有它们),以查找项目中可能不需要或过时的jar文件。另外,请检查random-1.0.0.jarrandom-1.0.1.jar等不同版本的广告罐,如果可能,请排除其中一个。

答案 1 :(得分:0)

您可能希望使用工具删除不需要的类。

这个问题涉及这个问题:

Tool to remove unnecessary dependencies in a Java project

但是关于Oracle的这个问题可能更有用:

https://forums.oracle.com/forums/thread.jspa?threadID=1311910

我认为GenJar2(http://code.google.com/p/genjar2/)可能最能满足您的需求。