java.lang.OutOfMemoryError:带有eclipse的tomcat中的PermGen空间

时间:2010-07-05 11:35:27

标签: eclipse tomcat

我在使用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 个答案:

答案 0 :(得分:97)

尝试提高perm空间,将以下参数添加到vm启动

-XX:PermSize = 256m -XX:MaxPermSize = 256m

还在Eclipse中向Tomcat添加 -XX:MaxPermSize = 256m Server > Open Launch Configuration > Arguments

更新(2014年):查看here at this question and answer了解the new Java 8 Metaspace.

看看这里:

How to deal with “java.lang.OutOfMemoryError: PermGen space” error

答案 1 :(得分:21)

您可以为eclipse配置这些参数:

“为了解决这个问题,我在Eclipse中停止了服务器。在 Servers 选项卡中双击服务器,打开服务器的Overview页面。单击打开启动配置然后在 Arguments 标签上。

我添加了以下VM参数:

-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled

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

答案 2 :(得分: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更新,那么可能值得一看。