java.lang.OutOfMemoryError:Jetty的PermGen空间错误

时间:2015-01-16 17:06:08

标签: java web-services jetty permgen

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

Dealing with “java.lang.OutOfMemoryError: PermGen space” error

但是这些解决方案似乎是使用Tomcat而不是Jetty。如果我重新部署我的服务几次,我会不断出现记忆错误。例如,要测试这个,我将转到我的webapps文件夹并运行touch * .xml来更新时间戳,然后重新运行jetty,我得到了内存不足错误。在我的jetty文件夹(包含bin,doc等,lib,日志,模块,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

4 个答案:

答案 0 :(得分:4)

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

-XX:MaxPermSize=1024m

这是一个常见问题,也在Jetty Documentation - Prevent Memory Leaks部分进行了解释:

  

Permgen问题

     

Jetty中的JSP引擎是Jasper。这最初是在   Apache Tomcat项目,但随着时间的推移已被许多人分叉   不同的项目。所有最多6个jetty版本都使用基于Apache的版本   Jasper独家,Jetty 6使用Apache Jasper仅用于JSP2.0。   随着JSP 2.1的出现,Jetty 6改用了Jasper   Sun的Glassfish项目,现在是参考实现。

     

贾斯珀的所有叉子都遇到了permgen空间的问题   可以通过使用jsp标记文件来承受压力。这是因为   jsp实现的类加载体系结构。每个jsp文件   有效地编译并将其类加载到自己的类加载器中   至于允许热替换。每个包含引用的jsp   如果需要,标记文件将编译标记,然后使用加载它   它自己的类加载器。如果你有许多引用同一标签的jsps   文件,然后标签的类将一遍又一遍地加载到   permgen空间,每个jsp一次。 相关的Glassfish错误报告是   bug # 3963,等效的Apache Tomcat错误报告为bug # 43878。 Apache Tomcat项目已经关闭了这个错误报告,状态为WON&#F; FIX,但是Glassfish的人仍然有bug   报告打开并安排修复。当修复成为   可用,Jetty项目将把它拿起并整合到我们的   发布计划

答案 1 :(得分:0)

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

答案 2 :(得分:0)

在Jetty 9.2 +

${jetty.base}目录中,添加jvm模块+默认配置

[user]$ cd mybase
[mybase]$ java -jar /path/to/jetty-distribution/start.jar --add-to-start=jvm
INFO: jvm             initialised in ${jetty.base}/start.ini (appended)
[mybase]$ 

现在去编辑你的${jetty.base}/start.ini并配置属性,取消注释你想要的东西(不要伪造{1}})jetty在启动时使用。

示例:

--exec

答案 3 :(得分:0)

这是一个较老的问题,但这解决了我的问题:

contextHandler.setInitParameter("org.eclipse.jetty.servlet.Default.useFileMappedBuffer", "false");