2016-05-03 2 views
2

Работа с webapp с использованием Tomcat8/Spring MVC/Spring Date/Hibernate, каждые несколько раз развертываний на сервере или даже сохранение в среде разработки java приведет к следующей ошибке. Кто-нибудь знает, как я могу избежать или исправить это? Я попытался увеличить JVM, чтобы иметь больше памяти безрезультатно. Весна настройка с помощью Java файлы конфигурации и не старый метод web.xmlОшибка PermGen Tomcat8/Spring Data/Hibernate при развертывании

[ContainerBackgroundProcessor[StandardEngine[Catalina]]] ERROR org.springframework.web.context.ContextLoader - Context initialization failed 
 
java.lang.OutOfMemoryError: PermGen space 
 
\t at java.lang.ClassLoader.defineClass1(Native Method) 
 
\t at java.lang.ClassLoader.defineClass(ClassLoader.java:800) 
 
\t at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) 
 
\t at org.apache.catalina.loader.WebappClassLoaderBase.findClassInternal(WebappClassLoaderBase.java:2494) 
 
\t at org.apache.catalina.loader.WebappClassLoaderBase.findClass(WebappClassLoaderBase.java:860) 
 
\t at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1302) 
 
\t at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1167) 
 
\t at org.springframework.util.ConcurrentReferenceHashMap$EntrySet.iterator(ConcurrentReferenceHashMap.java:794) 
 
\t at java.util.AbstractMap$1$1.<init>(AbstractMap.java:322) 
 
\t at java.util.AbstractMap$1.iterator(AbstractMap.java:321) 
 
\t at org.springframework.beans.CachedIntrospectionResults.clearClassLoader(CachedIntrospectionResults.java:164) 
 
\t at org.springframework.context.support.AbstractApplicationContext.resetCommonCaches(AbstractApplicationContext.java:881) 
 
\t at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:563) 
 
\t at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:446) 
 
\t at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:328) 
 
\t at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107) 
 
\t at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4810) 
 
\t at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5255) 
 
\t at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 
 
\t at org.apache.catalina.core.StandardContext.reload(StandardContext.java:3831) 
 
\t at org.apache.catalina.loader.WebappLoader.backgroundProcess(WebappLoader.java:292) 
 
\t at org.apache.catalina.core.StandardContext.backgroundProcess(StandardContext.java:5616) 
 
\t at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1377) 
 
\t at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1381) 
 
\t at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1381) 
 
\t at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1349) 
 
\t at java.lang.Thread.run(Thread.java:745) 
 
Exception in thread "ContainerBackgroundProcessor[StandardEngine[Catalina]]" java.lang.OutOfMemoryError: PermGen space

ответ

0

Я видел другие вопросы Tomcat PermGen, поэтому я сначала попробуйте использовать эти аргументы, чтобы увидеть, если это достаточно, чтобы увеличить размер PermGen.

-XX:+CMSClassUnloadingEnabled 
-XX:+CMSPermGenSweepingEnabled 

Если это не сработает, проверьте, чтобы увеличить PermGen, а не размер кучи. Вы можете установить размер PermGen со следующим JVM arg: -XX:MaxPermSize=256M

0

Это происходит из-за того, что ваше приложение не распаковывается. Вы получаете ошибку при сохранении в своей среде разработки, потому что это может привести к повторному развертыванию вашего приложения.

Этот тип ошибок очень трудно отладить, и если вы обнаружите причину, вы можете не решить эту проблему самостоятельно, потому что используемая вами библиотека может быть виновата. хороший прочтение при отслеживании таких ошибок можно найти здесь: https://plumbr.eu/blog/memory-leaks/hunting-down-memory-leaks-a-case-study.

У меня была такая же проблема лет назад, и это оказалось проблемой в log4j. в итоге мы сделали простой выход и решили перезапустить сервер приложений вместо повторного развертывания приложения.

Фактически, это одна из причин того, что многие проекты в настоящее время выбирают развертывание одного приложения на один сервер приложений (или встраивание сервера) и просто перезапускают все это при изменениях.

тем не менее, если у вас есть время, его стоит отслеживать это, потому что это может быть ошибка конфигурации. и вы много узнаете о своем приложении и его времени выполнения.

0

Надеюсь, вы сможете решить эту проблему, просто добавив в приложение свое ClassLoader Leak Prevention library. На момент написания этой статьи, это означает, что эта Maven DEPENDENCY

<dependency> 
    <groupId>se.jiderhamn</groupId> 
    <artifactId>classloader-leak-prevention</artifactId> 
    <version>1.15.2</version> 
</dependency> 

плюс в вашем web.xml (не будет необходимости в версии 2 скоро будет выпущен):

<listener> 
    <listener-class>se.jiderhamn.classloader.leak.prevention.ClassLoaderLeakPreventor</listener-class> 
</listener> 

Чтобы узнать больше о трети которые могут вызвать эту проблему и узнать, как вы можете отлаживать это как в своем собственном коде, так и в внешних библиотеках, см. this blog series of mine.

Смежные вопросы