使用eclipse和tomcat时出现java.lang.OutOfMemoryError: PermGen空间错误

45

在使用 Eclipse 中的 Tomcat 运行我的应用程序时,我经常遇到这个异常:

java.lang.OutOfMemoryError: PermGen space
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClassCond(ClassLoader.java:632)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:616)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
    at org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:1850)
    at org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:890)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1354)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1233)
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClassCond(ClassLoader.java:632)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:616)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
    at org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:1850)
    at org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:890)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1354)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1233)
    at org.hibernate.hql.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:265)
    at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:180)
    at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:134)
    at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:101)
    at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:80)
    at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:94)
    at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:156)
    at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:135)
    at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1650)
    at com.spacerdv.dao.impl.UserDaoImpl.getUserDetails(UserDaoImpl.java:170)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:307)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)

3个回答

97

在Netbeans中,可以通过以下方式添加这些参数:Services > Servers > Apache Tomcat(右键单击)> Properties > Platform > VM Options。 - DragonT
你可能想要添加 -server -Xmx1024m - QuakeCore
1
这种解决方案只是推迟了问题。我的Tomcat通常在MaxPermSize=512m下运行,但还是会用尽PermSize。当改变的代码经常自动部署时会发生这种情况。我的解决方法是定期显式地重启Tomcat。 - Hok

21

您可以为Eclipse配置以下参数:

"要解决此问题,我在Eclipse中停止了服务器。 在Servers选项卡中双击服务器以打开服务器的概述页面。 点击Open Launch Configuration,然后点击Arguments选项卡。

我添加了以下VM参数:

-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled

参考http://malcolmmallia.com/malcblog/?p=60


谢谢!我们的团队在更改Web服务堆栈后,在QA和生产服务器上遇到了一些问题,而这两个选项解决了我们的PermGen问题。(至少暂时解决了。) - The Awnry Bear

5
我今天也遇到了这个问题,完全出乎意料。昨天我更新了JDK/JRE从1.6.0_13到1.6.0_21以解决Glassfish 3.0.1的特定问题,Eclipse突然断开了与OutOfMemoryError: PermGen space错误相关的连接。在(不正确地)抱怨Glassfish插件并得出结论之后,清理工作区元数据未能解决问题,结果发现这是由于自1.6.0_20以来JVM供应商字符串从“Sun”更改为“Oracle”所致。 Eclipse没有识别新的JVM供应商,因此没有按照eclipse.ini中指定的VM参数进行应用。
这被报告为Eclipse问题319514,Eclipse团队很快发布了patch。在他们更永久地解决它之前,解决方法确实是将以下行添加到eclipse.ini中:
-XX:MaxPermSize=256m

如果您最近进行了JVM更新,那么看一下它可能是值得的。


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