Memory leaks Jetty 7:OutOfMemoryError:应用程序重新部署时的PermGen空间

Memory leaks Jetty 7:OutOfMemoryError:应用程序重新部署时的PermGen空间,memory-leaks,jetty,out-of-memory,permgen,jvm-arguments,Memory Leaks,Jetty,Out Of Memory,Permgen,Jvm Arguments,第一次应用程序正确启动。然后我删除webapp/*.war文件并粘贴新版本的*.war。Jetty开始部署新war,但出现错误java.lang.OutOfMemoryError:PermGen space。如何配置Jetty以修复错误/进行正确的重新部署 这对我没有帮助。 Jetty版本:Jetty-7.4.3.v20110701如果永久性内存不足,则需要重新启动jvm,在您的情况下,重新启动Jetty。您可以使用链接解决方案中的JVM选项来增加PermGen空间,这样以后就会发生这种情况(我

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

这对我没有帮助。

Jetty版本:Jetty-7.4.3.v20110701

如果永久性内存不足,则需要重新启动jvm,在您的情况下,重新启动Jetty。您可以使用链接解决方案中的JVM选项来增加PermGen空间,这样以后就会发生这种情况(我的意思是:在更多的重新部署之后)。但这种情况偶尔会发生,你几乎无法避免。您链接的答案很好地解释了什么是PermGenSpace以及为什么它会溢出

使用:

或者,如果这还不够的话

-XX:PermSize=256M -XX:MaxPermSize=512M
另外,如果使用此命令,请确保增加vm的可用空间量

使用


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

并解释问题的可能来源。每当应用程序容器的代码使用一个类来保存对某个类的引用时,就会阻止类的垃圾收集。上述博客条目中的示例是
java.util.logging.Level
构造函数:

protected Level(String name, int value) {
    this.name = name;
    this.value = value;
    synchronized (Level.class) {
        known.add(this);
    }
}
请注意,
known
java.util.logging.Level
的静态成员。构造函数存储对所有创建实例的引用。因此,只要应用程序的代码从外部加载或实例化了
级别
类,垃圾收集就无法删除您的类

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

你的选择基本上是:

  • 增加内存限制,减少错误打击的次数
  • 按照链接博客文章中的详细说明分析代码,避免使用存储对象引用的类

我对HotSpot也有同样的问题,但对于JRockit,它没有永久性的一代,问题已经消失了。它现在是免费的,所以你可能想试试:

看起来很像。每当您的应用程序在取消部署后留下一些类挂起时,您就会遇到这个问题。您可以尝试的最新版本,可能会找到剩余的类。

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

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


如果您有烫发机溢出的问题,那么您可能需要查看和。

对于Jetty7.6.6或更高版本,这可能会有所帮助


我们使用了
AppContextLeakPreventor
,它有助于解决permgen space导致的OOM错误

关于如何检测罪犯类的任何指导原则?对不起,我没有简单的步骤可以遵循。您可以尝试一个普通的堆转储,并检查它是否存在意外的对象。对它们的引用可能会给你足够的线索来发现漏洞。您还可以在Eclipse的内存分析器中找到一个有用的搜索工具:答案之所以被编辑,是因为它被移动到了,并且被移动到了,感谢您注意到@sasfalvi tamás
-Xms128M -Xmx256M
protected Level(String name, int value) {
    this.name = name;
    this.value = value;
    synchronized (Level.class) {
        known.add(this);
    }
}