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提供的任何类中,因此无法在您的应用程序中修复.您只能通过更改自己的代码来阻止此问题!
您的选择基本上是:
如果发生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)
| 归档时间: |
|
| 查看次数: |
16125 次 |
| 最近记录: |