2010-07-05 13 views
43

otrzymuję ten wyjątek często podczas uruchamiania mojej aplikacji na Tomcat przy użyciu Eclipse:java.lang.OutOfMemoryError: PermGen przestrzeń w tomcat z Zaćmienie

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) 
+0

możliwe duplikat [Jak radzić sobie z "java.lang.OutOfMemoryError: PermGen space" ERROR] (http://stackoverflow.com/questions/88235/how-to-deal-with-java -lang-outofmemoryerror-permgen-space-error) – Lucero

Odpowiedz

93

rozkręć miejsca Perm, dodać następujące parametry do VM rozruchu

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

dodać -XX: MaxPermSize = 256m Tomcat Eclipse: Server > Open Launch Configuration > Arguments

Update (w 2014 roku): spojrzeć here at this question and answer o the new Java 8 Metaspace.

i spojrzeć tutaj:

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

+0

W Netbeans parametry te można dodać w: Usługi> Serwery> Apache Tomcat (prawy przycisk myszy)> Właściwości> Platforma> Opcje VM – DragonT

+0

również możesz chcieć dodać '-server -Xmx1024m' – QuakeCore

+1

To rozwiązanie tylko opóźnia problem. Mój tomcat zwykle działa przy MaxPermSize = 512m i nadal wyczerpuje PermSize. Zdarza się to, gdy zmieniony kod zostanie automatycznie zautomatyzowany. Moje obejście polega na tym, że raz po raz uruchamiaj tomcat jawnie. – Hok

5

mam ten problem również dzisiaj. Stało się to zupełnie nie na miejscu. Wczoraj zaktualizowałem JDK/JRE z wersji 1.6.0_13 do 1.6.0_21, aby naprawić konkretny problem Glassfish 3.0.1, a Eclipse nagle zerwał z tymi błędami OutOfMemoryError: PermGen space. Po (niepoprawnie) wywołaniu wtyczki Glassfish i stwierdzeniu, że problem nie został rozwiązany po wyczyszczeniu metadanych obszaru roboczego, okazuje się, że jest to spowodowane zmianą ciągu dostawcy JVM z "Sun" na "Oracle" od 1.6.0_20 . Eclipse nie rozpoznał nowego dostawcy JVM, a tym samym nie zastosował argumentów VM określonych w eclipse.ini.

Zostało to zgłoszone jako problem Eclipse 319514, a chłopcy Eclipse szybko wypuścili patch. Dopóki nie stała się ona bardziej na stałe, obejście jest rzeczywiście dodać następujące wiersze do eclipse.ini:

 
-XX:MaxPermSize=256m 

Tak więc, jeśli niedawno zrobiłem aktualizację JVM, to może warto spojrzeć na niego.

20

Można skonfigurować te argumenty dla Eclipse:

„Aby rozwiązać ten problem zatrzymałem serwer w Eclipse podwójnym kliknięciu na serwerze w Serwery kartę aby otworzyć stronę Przegląd serwera Kliknięto .. . otwarte Uruchomienie Konfiguracja a następnie na argumenty zakładka

dodałem następujące argumenty VM:

-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled 

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

+0

Dziękujemy! Nasz zespół miał problemy z naszymi QA i serwerami produkcyjnymi po zmianie stosów serwisów internetowych, a te dwie opcje naprawiły problemy PermGen.(Na razie przynajmniej.) –

Powiązane problemy