Подтвердить что ты не робот

Java.lang.OutOfMemoryError: пространство PermGen в tomcat с eclipse

Я часто получаю это исключение при запуске моего приложения в tomcat с использованием eclipse:

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)
4b9b3361

Ответ 1

попытайтесь поднять пространство perm, добавьте следующие параметры в vm start-up

-XX: PermSize = 256 м -XX: MaxPermSize = 256 м

также добавьте -XX: MaxPermSize = 256 м к Tomcat в Eclipse: Server > Open Launch Configuration > Arguments

Обновление (в 2014 году): посмотрите здесь, на этот вопрос и ответ о новый Java 8 Metaspace.

и посмотрите здесь:

Как бороться с ошибкой "java.lang.OutOfMemoryError: PermGen space"

Ответ 2

Вы можете настроить эти аргументы для eclipse:

"Чтобы решить эту проблему, я остановил сервер в Eclipse. Дважды щелкните на сервере на вкладке" Серверы ", чтобы открыть страницу" Обзор "для сервера. Нажмите" Открыть запуск ", а затем на вкладке" Аргументы ".

Я добавил следующие аргументы VM:

-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled

ref to http://malcolmmallia.com/malcblog/?p=60

Ответ 3

У меня эта проблема и сегодня. Это случилось совершенно неожиданно. Вчера я обновил JDK/JRE с 1.6.0_13 до 1.6.0_21, чтобы исправить конкретную проблему Glassfish 3.0.1, и Eclipse внезапно нарушила эти ошибки OutOfMemoryError: PermGen space. После (некорректно) разглаживания плагина Glassfish и заключения о том, что проблема не была исправлена ​​после очистки метаданных рабочей области, выясняется, что это вызвано изменением строки поставщика JVM от "Sun" до "Oracle" с версии 1.6.0_20, Eclipse не признает нового поставщика JVM и поэтому не применяет аргументы VM, как указано в eclipse.ini.

Об этом сообщалось как о проблеме Eclipse 319514, и мальчики Eclipse быстро выпустили патч. Пока они не будут исправлены более надолго, обходной путь действительно должен добавить следующие строки в eclipse.ini:

-XX:MaxPermSize=256m

Итак, если вы недавно сделали обновление JVM, возможно, стоит взглянуть на него.