java.lang.OutOfMemoryError:Jetty发生PermGen空间错误

我目前正在得到一个java.lang.OutOfMemoryError: PermGen space 。 我使用Jetty和Linux Ubuntu。 我曾尝试阅读和尝试在以前的类似问题中提供的不同解决方案,但我没有取得任何成功。 一个类似的问题是

处理“java.lang.OutOfMemoryError:PermGen空间”错误

但是这些解决方案似乎使用Tomcat而不是Jetty。 如果我重新部署我的服务几次,我一直不知道错误的错误。 例如,要测试此操作,我将转到我的webapps文件夹并运行touch * .xml来更新时间戳,然后重新运行jetty,并收到内存不足错误。 在我的jetty文件夹(包括bin,doc等,lib,logs,modules,start.jar)中我运行

java -jar ../start.jar

但是这给了我错误。 然后,我尝试了我在其他示例中阅读的内容,例如:

java -jar ../start.jar JAVA_OPTS="-Xms256m -Xmx512m -XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled"

要么

-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled

要么

-XX:MaxPermSize=128m

然后,当我去到Firefox并导航到localhost:8080和刷新,在终端我不断收到错误

java.lang.OutOfMemoryError: PermGen space

希望您只需使用我的ClassLoader泄漏预防库即可摆脱这些问题。 有很多不同的错误会导致这些类型的内存泄漏,无论是在您自己的代码中还是在第三方库中。 关于这个问题的更多信息,如何追踪它和已知的罪犯,可以在我的这个博客系列中找到。 特别注意Jetty本身中的这个错误,这可能会导致某些版本的这类泄漏。


除了将MaxPermSize提高到更高值(例如1024m)之外,您无能为力:

-XX:MaxPermSize=1024m

这是一个常见问题,Jetty文档 - 防止内存泄漏部分也对此进行了说明:

Permgen问题

Jetty中的JSP引擎是Jasper。 它最初是在Apache Tomcat项目下开发的,但随着时间的推移,它已被许多不同的项目所分解。 所有Jetty版本最多使用6个基于Apache的Jasper,Jetty 6仅使用Apache Jasper仅适用于JSP2.0。 随着JSP 2.1的出现,Jetty 6转向使用Sun的Glassfish项目中的Jasper,该项目现在成为参考实现。

Jasper的所有分支都有一个问题,即使用jsp标签文件,permgen空间可能会受到压力。 这是因为jsp实现的类加载架构。 每个jsp文件都被有效地编译,并且它的类被加载到它自己的类加载器中,以便进行热替换。 每个包含对标记文件的引用的jsp将在必要时编译该标记,然后使用它自己的类加载器加载它。 如果你有许多jsps引用同一个标记文件,那么标记的类将会一次又一次地加载到permgen空间,每个jsp都会加载一次。 相关的Glassfish错误报告是bug#3963,等效的Apache Tomcat错误报告是错误#43878。Apache Tomcat项目已经关闭了这个错误报告,状态不会修复,但是Glassfish的人仍然会打开错误报告,已经安排它是固定的。 当修补程序变得可用时,Jetty项目会将其加入并发布到我们的发布程序中


您可以在Jetty主文件夹的start.ini文件中添加这些参数。 如果justt不起作用,您可以尝试设置更高的MaxPermSize,例如1024m。

链接地址: http://www.djcxy.com/p/54997.html

上一篇: java.lang.OutOfMemoryError: PermGen space error with Jetty

下一篇: PermGen out of space before Max is reached