У меня возникли проблемы Hot Развертывание веб-приложения Spring-MVC 4.0 (не SpringBoot). Я пытаюсь перейти на xml-less и просто использовать JavaConfig. Результат OutOfMemoryErrors, когда я удаляю web.xml или , когда я развертываю пустой web.xml с пустым элементом. Это не происходит каждый раз, когда приложение горячее развертываются, и после успешного горячего развертывания, приложение работает правильно, но после трех или четырех горячих развертываний с этой конфигурацией возникает следующая ошибка:OutOfMemoryError при использовании горячего развертывания приложения SpringMVC для Tomcat7 - возможное отношение к log4j2
Jul 03, 2015 10:49:43 AM org.springframework.web.context.ContextLoader initWebApplicationContext
SEVERE: Context initialization failed
java.lang.OutOfMemoryError: PermGen space
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:547)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
at org.springframework.context.support.PostProcessorRegistrationDelegate.registerBeanPostProcessors(PostProcessorRegistrationDelegate.java:220)
at org.springframework.context.support.AbstractApplicationContext.registerBeanPostProcessors(AbstractApplicationContext.java:615)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:465)
at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:403)
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:306)
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:106)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:5014)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5524)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:649)
at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:1081)
at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1877)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
Jul 03, 2015 10:49:44 AM org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor run
SEVERE: Unexpected death of background thread ContainerBackgroundProcessor[StandardEngine[Catalina]]
java.lang.OutOfMemoryError: PermGen space
at java.util.concurrent.FutureTask.report(FutureTask.java:122)
at java.util.concurrent.FutureTask.get(FutureTask.java:188)
at org.apache.catalina.startup.HostConfig.deployWARs(HostConfig.java:816)
at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:488)
at org.apache.catalina.startup.HostConfig.check(HostConfig.java:1655)
at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:328)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1374)
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.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.util.concurrent.FutureTask.report(FutureTask.java:122)
at java.util.concurrent.FutureTask.get(FutureTask.java:188)
at org.apache.catalina.startup.HostConfig.deployWARs(HostConfig.java:816)
at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:488)
at org.apache.catalina.startup.HostConfig.check(HostConfig.java:1655)
at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:328)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1374)
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.run(ContainerBase.java:1524)
at java.lang.Thread.run(Thread.java:745)
Очевидно, что память каким-то образом протекает с такой конфигурацией.
Возможно, может быть, что это веб-приложение использует Log4j2. An earlier Stack Overflow question исследовал это. Если веб-приложение использует только следующие минимальные web.xml
<?xml version="1.0"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<context-param>
<param-name>log4jConfiguration</param-name>
<param-value>file:///path/to/log4j2.xml</param-value>
</context-param>
</web-app>
того WebApp может быть горячим развернутым снова и снова без получения этих ошибок.
Может ли кто-нибудь угадать догадки о том, что может происходить здесь?
Обновление: - См. Обсуждение между мной @Makoton и ниже. Похоже, что может возникнуть проблема с сборкой мусора, связанная с загрузкой log4j2 из приложения (способом Java Config) и его загрузкой из web.xml (традиционным способом). См. this article, который развенчивает «классическое» предложение переполнения стека для этой проблемы (аналогично тому, как цитируется Makoton).
Это заставляет меня думать о SpringBoot, который, как я понимаю, загружает Tomcat как часть приложения. Это может быть одним из решений этой проблемы.
Вы хотите сказать, возможно, «Ошибка в том, что если элемент отсутствует в файле web.xml ИЛИ, если нет NO web.xml"? Это была моя ситуация. Я добавил конфигурацию log4j2, потому что это был единственный способ, которым я мог идти. Похоже, вы говорите, что я могу поместить конфигурацию log4j2 обратно в конфигурацию Spring java и иметь эту вещь в web.xml. Или я мог дождаться исправления. У меня все в порядке? –
Если отсутствующий web.xml приводит к тому, что log4j не может найти имя контекста сервлета, тогда да. Я не пробовал с весной. –
Я подтвержу следующие случаи: 1) если отображаемое имя не включено в файл web.xml, но включен параметр контекста log4jConfiguration, утечки памяти не происходят и сообщения об ошибке отсутствуют. 2) если отображаемое имя включено и log4jConfiguration c.p. включая, такой же как прежний. 3) если ни один из параметров не включен в web.xml, происходит утечка памяти. 4) если отображаемое имя включено в web.xml и не содержит конфигурацию log4j в web.xml, но программную конфигурацию log4j, включенную в java, то никакие утечки памяти, исходная отсутствующая ошибка конфигурации msg не видны в журналах, но javaconf делает это правильно. –