我目前正在获得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
答案 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");