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

fed*_*lov 5 memory-leaks jetty out-of-memory permgen jvm-arguments

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

这个解决方案对我没有帮助.
Jetty版本:jetty-7.4.3.v20110701

Aug*_*ing 11

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

博客条目及其后续行动说明问题的一个可能来源.只要应用程序容器的代码使用包含对其中一个类的引用的类,就会阻止类的垃圾回收.上述博客条目中的示例是java.util.logging.Level构造函数:

protected Level(String name, int value) {
    this.name = name;
    this.value = value;
    synchronized (Level.class) {
        known.add(this);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

您的选择基本上是:

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


Ang*_*chs 7

如果发生PermGen内存不足,则需要重新启动jvm,在你的情况下重新启动jetty.您可以使用链接解决方案中的JVM选项增加PermGen空间,以便稍后进行(稍后我的意思是:在重新部署之后).但它会偶尔发生,你可以做任何事情,以避免这种情况.您链接的答案很好地解释了PermGenSpace是什么以及它溢出的原因.

使用:

-XX:PermSize=64M -XX:MaxPermSize=128M
Run Code Online (Sandbox Code Playgroud)

或者,如果那还不够

-XX:PermSize=256M -XX:MaxPermSize=512M
Run Code Online (Sandbox Code Playgroud)

此外,如果使用此命令,请务必增加vm可用的空间量.

使用

-Xms128M -Xmx256M
Run Code Online (Sandbox Code Playgroud)