2014-10-28 2 views
2

Я работаю с Spring sts. Я надеюсь, что мое web-приложение на сервере Tomcat v7.0, которое я добавил, используя мастер внутреннего сервера.Весенний набор инструментов: Tomcat server constant permgen

На сервере сохраняется нехватка памяти и выдается ошибка Permgen при редактировании java-файлов, так как сервер постоянно передислоцируется автоматически (возможно, это мое понимание). Есть ли способ увеличить выделенное пространство перментинга для этого сервера, учитывая, что я не установил свою собственную копию tomcat?

Любая помощь или разъяснение были бы замечательными.

Я добавил StackTrace, если это поможет:

 

    SEVERE: Unexpected death of background thread ContainerBackgroundProcessor[StandardEngine[Catalina]] 
    java.lang.OutOfMemoryError: PermGen space 
     at java.lang.ClassLoader.defineClass1(Native Method) 
     at java.lang.ClassLoader.defineClass(ClassLoader.java:800) 
     at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) 
     at org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:2957) 
     at org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:1210) 
     at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1690) 
     at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1571) 
     at org.apache.log4j.spi.LoggingEvent.(LoggingEvent.java:159) 
     at org.apache.log4j.Category.forcedLog(Category.java:391) 
     at org.apache.log4j.Category.log(Category.java:856) 
     at org.slf4j.impl.Log4jLoggerAdapter.log(Log4jLoggerAdapter.java:602) 
     at org.apache.commons.logging.impl.SLF4JLocationAwareLog.error(SLF4JLocationAwareLog.java:225) 
     at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:336) 
     at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:106) 
     at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4992) 
     at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5490) 
     at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 
     at org.apache.catalina.core.StandardContext.reload(StandardContext.java:4007) 
     at org.apache.catalina.loader.WebappLoader.backgroundProcess(WebappLoader.java:425) 
     at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1345) 
     at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1546) 
     at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1556) 
     at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1556) 
     at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1524) 
     at java.lang.Thread.run(Thread.java:745) 

    Exception in thread "ContainerBackgroundProcessor[StandardEngine[Catalina]]" java.lang.OutOfMemoryError: PermGen space 
     at java.lang.ClassLoader.defineClass1(Native Method) 
     at java.lang.ClassLoader.defineClass(ClassLoader.java:800) 
     at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) 
     at org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:2957) 
     at org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:1210) 
     at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1690) 
     at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1571) 
     at org.apache.log4j.spi.LoggingEvent.(LoggingEvent.java:159) 
     at org.apache.log4j.Category.forcedLog(Category.java:391) 
     at org.apache.log4j.Category.log(Category.java:856) 
     at org.slf4j.impl.Log4jLoggerAdapter.log(Log4jLoggerAdapter.java:602) 
     at org.apache.commons.logging.impl.SLF4JLocationAwareLog.error(SLF4JLocationAwareLog.java:225) 
     at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:336) 
     at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:106) 
     at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4992) 
     at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5490) 
     at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 
     at org.apache.catalina.core.StandardContext.reload(StandardContext.java:4007) 
     at org.apache.catalina.loader.WebappLoader.backgroundProcess(WebappLoader.java:425) 
     at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1345) 
     at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1546) 
     at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1556) 
     at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1556) 
     at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1524) 
     at java.lang.Thread.run(Thread.java:745) 

Спасибо :)

+0

Я преследую аналогичную проблему - см. Http://stackoverflow.com/questions/31211868/outofmemoryerror-when-hot-deploying-springmvc-app-to-tomcat7-possible-relation - и хотел бы спросить вас, если конфигурация log4j или log4j2 должна была что-то сделать, чтобы вы обнаружили утечку. –

+0

Я так и не решился. Но, согласно моим журналам, может быть использован драйвер JDBC, который вызывает проблемы. Я не думаю, что причиной является log4j config. – 1000Suns

ответ

2

Действительно, вы можете увеличить пространство пермгенов, которое по крайней мере отложит OutOfmemoryError: Permgen space. Это будет так же просто, как добавление (или увеличений, если он присутствует) параметр, подобный следующему пример выделяющего 512M для PermGen пространства:

java -XX:MaxPermSize=512m your.package.YourClass 

На основании вашего описания, хотя я считаю, что ваше приложение содержит утечку загрузчика, который происходит во время перераспределения. Если мои убеждения верны, то увеличение пространства пергентов просто откладывает неизбежное, а не решение основной проблемы. Чтобы решить эту проблему, вы можете сделать кучу дампа, проанализировать содержимое или использовать специализированные инструменты, такие как Plumbr memory leak detector.

Полное раскрытие информации, я являюсь аффилированным лицом с Plumbr.

0

Я думаю, что вы можете настроить поведение передислоцировать и избежать постоянной передислокации в редакторе сервера. В дополнение к этому вы также должны установить опцию permgen vm в конфигурации запуска для сервера (Run -> Run Configurations ...).