【问题标题】:java.lang.OutOfMemoryError: PermGen space solutionjava.lang.OutOfMemoryError: PermGen 空间解决方案
【发布时间】:2013-10-09 13:18:28
【问题描述】:

有类似的问题,但没有一个问题的答案..

Here 它说“解决这个问题的一个技巧是 JDBC 驱动程序由通用类加载器而不是应用程序类加载器加载,您可以通过将驱动程序的 jar 传输到 tomcat lib 中而不是将其捆绑在 Web 应用程序的战争文件

不明白通过普通类加载器加载是什么意思,它与应用程序类加载器有何不同。

【问题讨论】:

    标签: java classloader heap-memory


    【解决方案1】:

    这意味着加载 JDBCDriver 类的 ClassLoader 是应用程序服务器的类加载器,它是应用程序类加载器的父级。因此,驱动程序可用于服务器上的每个应用程序,并且不会在每次重新启动应用程序时重新加载(如果您没有正确取消注册,可能会导致 permgen 问题)

    【讨论】:

      【解决方案2】:

      每次部署应用程序并从那里加载一个类(以使用它)时,应用程序类加载器都会加载它。应用程序越多,加载的“相同”类就越多。如果您使用 tomcat 的“通用”类加载器,则每次安装 tomcat 时该类只会加载一次。

      【讨论】:

      • 你确定它是这样工作的吗?无论我们启动应用程序多少次,都可以只加载一次类?
      【解决方案3】:

      OutOfMemoryError: PermGen space 通常只有在您使用 Tomcat 的热重新部署功能时才会出现问题。如果您只是在部署中使用了大量的类,也会发生这种情况。

      增加 VM 中可用的 PermGen 数量将解决大量类问题。这可以通过将-XX:MaxPermSize=128m-XX:MaxPermSize=256m 添加到环境变量JAVA_OPTSCATALINA_OPTS 来完成(这通常可以在Tomcat 启动脚本中完成)。如果您直接启动 Tomcat,您可以在 shell 中导出这些环境变量。

      不幸的是,这并不能完全解决重新部署问题,它只会使您可以在 PermGen 用完之前重新部署更多次。要解决此问题,您需要确保您的 Web 应用程序正确且完整地卸载。这包括确保由您的 webapp 启动的所有线程都停止,并且加载的 JDBC 驱动程序被正确取消注册等。解决此问题的另一种方法是在对应用程序进行更改时不使用热重新部署并重新启动 Tomcat。

      【讨论】:

        猜你喜欢
        • 2011-09-04
        • 1970-01-01
        • 2012-07-31
        • 2016-06-07
        • 2017-04-22
        • 2013-08-02
        • 2011-11-05
        相关资源
        最近更新 更多