Maven "Exception in thread "http-bio-8080-exec-32" java.lang.OutOfMemoryError: PermGen space" Maven“线程“http-bio-8080-exec-32”异常:java.lang.OutOfMemoryError:PermGen空间”

5

我在Ubuntu 11.10下使用Struts2 + Spring和Hibernate框架在NetBeans中制作了一个项目。第一次运行正常,但是当我第二或第三次运行它时,我始终会收到这个异常。如果不使用Maven一切都很好。我使用apt-get install安装了Maven,并在usr/bin/mvn中添加了这一行export MAVEN_OPTS=-Xmx512m,但是没有成功。如何获得更好的性能呢?


你是在NetBeans里运行项目还是从命令行用Maven启动它? - beerbajay
我正在使用Netbeans运行它。 - Denees
3个回答

5
你应该添加这行代码:
export MAVEN_OPTS="-Xmx512M -XX:MaxPermSize=512M" 

请注意,一些用户报告说双引号会出现问题,因此您可能想使用以下内容:
export MAVEN_OPTS=-Xmx512M -XX:MaxPermSize=512M 

编辑:

由于您正在使用Tomcat,请使用以下内容:

  1. 打开 tomcat/bin/catalina.sh
  2. 将此行添加到 JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms512m -Xmx1024m -XX:NewSize=256m -XX:MaxNewSize=256m -XX:PermSize=256m -XX:MaxPermSize=256m -XX:+DisableExplicitGC"
  3. 保存并退出,重新启动Tomcat

更多信息请参见此处...


没有帮助,第二次运行仍然出现了内存溢出问题。 - Denees
@DenisHoss 由于您正在使用Tomcat,请参见我的更新答案。 - Jaanus
好的,这是一个解决方案,但不长久,在第7次运行时我遇到了相同的异常。我对我的应用程序进行了分析,没有发现Java泄漏,那么问题到底出在哪里呢?是Maven太善变了吗? - Denees
@DenisHoss 好的,将PermSize和MaxPermsize都改为512m,然后重新启动(它们目前是256m)。 - Jaanus
好的,我已经做了,我会看看现在的情况,并回来给你答复。 - Denees
显示剩余4条评论

4
PermGen空间通常在对象未正确清除其内存时抛出此错误。通常是“孤岛”的原因,即具有仍指向它们的引用的对象,但您作为程序员无法访问这些引用,因为它们存在于您的空间之外。您可能正在使用引起此问题的库,而且除非停止使用此库,否则问题可能不会消失。至于哪个库,我不确定,有很多文章解释如何找到它,但这是一项繁琐的任务,除非您很幸运,否则可能需要一段时间。内存分析工具可以提供一些想法。 好的解释文章

我的项目只有Struts、Spring、Hibernate依赖和2个JSP页面,这是一个测试项目。 - Denees
很可能是其中一个,可能是在使用静态引用调用它们的类/方法时。通常发生在从服务器重新加载时,我之前遇到过log4net的这个问题,不得不停止使用我正在调用的静态调用来停止这个问题。我认为这是Java中最烦人和难以找到的错误之一,对于测试项目,我不会浪费时间去查找原因,但如果是生产项目,你必须这样做,因为更新软件可能会导致问题。 - pengibot
这不是Maven的问题。尽管可以调查一下。避免出现这种情况的方法是在添加新的.war文件之前,先删除旧的.war文件,这样引用应该会在99%的情况下从服务器中删除...如果您尝试直接更新,那么很可能会遇到这个问题很多次。 - pengibot

3

-Xmx512m 不会有帮助,因为它是增加堆空间的。你是运行时 PermGen 空间不足,而不是堆空间。

尝试增加 PermGen 空间并设置一些垃圾回收标志。这里有更多信息:Tomcat 6 中经常出现的 "PermGen"


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接