3

我们有一个 web 应用程序,它依赖于大约 125 个 jar,包括 spring、hibernet、zk 等。

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

  • 有没有办法控制启动时加载多少类,以便应用程序快速启动?
  • 有没有办法从 permgen 中释放/卸载不常用的类?[这些问题特定于从外部 jar 加载的类]

我曾尝试使用为 java 指定的 -XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled 选项。但一段时间后只有 42 个类被卸载。

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

4

2 回答 2

1

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

从类路径中删除 jar 将产生NoClassDefFoundError. 我猜你必须忍受这么多罐子,除非其中一些是不需要的(这不容易找到)。

最好检查你的依赖关系图(maven 和 gradle 有它们),看看你的项目中可能不需要或过时的 jars。还要检查不同版本的罐子,如果可能的话random-1.0.0.jarrandom-1.0.1.jar排除其中一个。

于 2012-10-02T10:52:32.343 回答
0

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

这个问题处理了这个问题:

删除 Java 项目中不必要的依赖项的工具

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

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

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

于 2012-10-02T10:59:19.063 回答