【问题标题】:Too many classes loaded when application is deployed on tomcat在tomcat上部署应用程序时加载的类太多
【发布时间】:2012-10-02 10:42:57
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: java tomcat profiling classloader


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢法力。如果项目是基于 Maven 的,Maven 依赖插件会很有帮助。不幸的是,这个项目不是基于 Maven 的。
    【解决方案2】:

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

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

    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/) 可能最能满足您的需求。

    【讨论】:

    • 谢谢詹姆斯。您共享的链接非常有用,特别是 Oracle 链接,因为我已经查看了其他 SO 链接:)。使用这些工具,我能够获得初始依赖项详细信息。之后,我不得不手动修复运行时依赖项。如果没有更好的解决方案,将接受您的回答。有没有办法从 permgen 中释放/卸载不常用的类? [外部 jar 类]
    • 您可能需要按照此处的步骤操作:javabeat.net/2010/01/java-lang-outofmemoryerror-permgen-space
    猜你喜欢
    • 1970-01-01
    • 2017-12-17
    • 2016-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多