【问题标题】:Jetty 7: OutOfMemoryError: PermGen space on application redeployJetty 7:OutOfMemoryError:应用程序重新部署时的 PermGen 空间
【发布时间】:2011-10-20 20:38:54
【问题描述】:

第一次应用正确启动。然后我删除 webapp/*.war 文件并粘贴新版本的 *.war。 Jetty 开始部署新的战争,但出现错误java.lang.OutOfMemoryError: PermGen space。如何配置 Jetty 以修复错误/进行正确的重新部署?

这个solution 对我没有帮助。
码头版本:jetty-7.4.3.v20110701

【问题讨论】:

    标签: memory-leaks jetty out-of-memory permgen jvm-arguments


    【解决方案1】:

    可能没有办法解决问题。每个 JVM 都有一个用于类加载和静态数据的 PermGen 内存区域。每当您的应用程序被取消部署时,它的类加载器都应该被丢弃,并且所有由它加载的类也应该被丢弃。当由于对类加载器的其他引用仍然存在而失败时,垃圾收集类加载器和您的应用程序类也将失败。

    A blog entryits follow up 解释了问题的可能根源。每当应用程序容器的代码使用包含对您的某个类的引用的类时,就会阻止对您的类进行垃圾收集。上述博客条目中的示例是 java.util.logging.Level 构造函数:

    protected Level(String name, int value) {
        this.name = name;
        this.value = value;
        synchronized (Level.class) {
            known.add(this);
        }
    }
    

    注意knownjava.util.logging.Level 的静态成员。构造函数存储对所有已创建实例的引用。因此,一旦 Level 类从您的应用程序代码中加载或实例化,垃圾收集就无法删除您的类。

    要解决此问题,您可以避免使用您自己的代码使用的所有类,或者确保没有使用您的代码对您的类进行引用。这两个问题都可能发生在随 Java 提供的任何类中,因此在您的应用程序中修复是不可行的。您无法通过仅更改自己的代码来防止问题发生!

    您的选择基本上是:

    • 增加内存限制并减少发生错误的频率
    • 按照链接的博客文章中的详细说明分析您的代码,并避免使用存储对您的对象的引用的类

    【讨论】:

    【解决方案2】:

    如果 PermGen 发生内存不足,您需要重新启动 jvm,在您的情况下重新启动码头。您可以使用链接解决方案中的 JVM 选项增加 PermGen 空间,以便稍后发生(我的意思是稍后:在更多重新部署之后)。但它每隔一段时间就会发生一次,你几乎可以做任何事情来避免这种情况。您链接的答案很好地解释了 PermGenSpace 是什么以及它溢出的原因。

    用途:

    -XX:PermSize=64M -XX:MaxPermSize=128M
    

    或者,如果这还不够的话

    -XX:PermSize=256M -XX:MaxPermSize=512M
    

    此外,如果您使用此命令,请务必增加一般虚拟机的可用空间量。

    使用

    -Xms128M -Xmx256M
    

    【讨论】:

      【解决方案3】:

      对于 Jetty 7.6.6 或更高版本,这可能对 http://www.eclipse.org/jetty/documentation/current/preventing-memory-leaks.html 有所帮助。

      我们使用了AppContextLeakPreventer,它帮助解决了由于 permgen 空间导致的 OOM 错误

      【讨论】:

        【解决方案4】:

        我在使用 HotSpot 时也遇到了同样的问题,但是对于没有永久代的 JRockit,问题已经消失了。它现在是免费的,所以你可能想尝试一下:https://blogs.oracle.com/henrik/entry/jrockit_is_now_free_and

        【讨论】:

          【解决方案5】:

          看起来很像Permanent Generation leak。每当您的应用程序在取消部署后留下一些类闲置时,您就会遇到这个问题。你可以试试最新版的Plumbr,说不定会找到剩下的类。

          【讨论】:

            【解决方案6】:

            面向未来的读者(相对于提出此问题的时间):

            JDK 8 中,Perm Gen Space 消失了(不再存在)。取而代之的是现在的元空间,它取自机器的本机空间。

            如果您遇到 Perm Gen Overflow 问题,那么您可能需要查看 this explanationthis comments on the removal process

            【讨论】:

              猜你喜欢
              • 2011-10-12
              • 2013-03-08
              • 1970-01-01
              • 2012-03-12
              • 1970-01-01
              • 1970-01-01
              • 2012-03-03
              • 2016-08-05
              • 2014-10-14
              相关资源
              最近更新 更多