使用Tomcat8 / Spring MVC / Spring Date / Hibernate处理webapp,每个部署到服务器甚至保存在java开发环境中都会导致以下错误。有谁知道我怎么能避免或解决这个问题?我已经尝试增加JVM以获得更多内存但无济于事。 Spring是使用java配置文件设置的,而不是旧的web.xml方法
[ContainerBackgroundProcessor[StandardEngine[Catalina]]] ERROR org.springframework.web.context.ContextLoader - Context initialization failed
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.WebappClassLoaderBase.findClassInternal(WebappClassLoaderBase.java:2494)
at org.apache.catalina.loader.WebappClassLoaderBase.findClass(WebappClassLoaderBase.java:860)
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1302)
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1167)
at org.springframework.util.ConcurrentReferenceHashMap$EntrySet.iterator(ConcurrentReferenceHashMap.java:794)
at java.util.AbstractMap$1$1.<init>(AbstractMap.java:322)
at java.util.AbstractMap$1.iterator(AbstractMap.java:321)
at org.springframework.beans.CachedIntrospectionResults.clearClassLoader(CachedIntrospectionResults.java:164)
at org.springframework.context.support.AbstractApplicationContext.resetCommonCaches(AbstractApplicationContext.java:881)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:563)
at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:446)
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:328)
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4810)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5255)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.StandardContext.reload(StandardContext.java:3831)
at org.apache.catalina.loader.WebappLoader.backgroundProcess(WebappLoader.java:292)
at org.apache.catalina.core.StandardContext.backgroundProcess(StandardContext.java:5616)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1377)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1381)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1381)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1349)
at java.lang.Thread.run(Thread.java:745)
Exception in thread "ContainerBackgroundProcessor[StandardEngine[Catalina]]" java.lang.OutOfMemoryError: PermGen space
&#13;
答案 0 :(得分:0)
我已经看过其他Tomcat PermGen问题了,所以我首先尝试使用这些args在增加PermGen大小之前确定它是否足够。
-XX:+CMSClassUnloadingEnabled
-XX:+CMSPermGenSweepingEnabled
如果这不起作用,请检查以确保增加PermGen而不是堆大小。您可以使用以下JVM arg设置PermGen大小:-XX:MaxPermSize=256M
答案 1 :(得分:0)
这是因为您的应用程序没有干净地取消部署。您在开发环境中遇到了保存错误,因为这可能会触发您的应用程序的重新部署。
这种错误实际上很难调试,如果找到原因,您可能无法自行解决问题,因为您使用的库可能有问题。有关追踪此类错误的详细信息,请访问:https://plumbr.eu/blog/memory-leaks/hunting-down-memory-leaks-a-case-study。
几年前我遇到了同样的问题,结果证明这是log4j中的一个问题。最后我们采取了简单的方法,并决定重新启动应用程序服务器而不是重新部署应用程序。事实上,这是现在许多项目选择为每个appserver部署一个应用程序(或嵌入服务器)并且只是在更改时重新启动整个事情的原因之一。
尽管如此,如果你有时间,它值得追踪,因为它可能是一个配置错误。并且您了解了很多关于您的应用及其运行时的信息。
答案 2 :(得分:0)
希望您只需将ClassLoader Leak Prevention library添加到您的应用中即可解决问题。在撰写本文时,这意味着这个Maven依赖
conditionalPanel
加上您的<dependency>
<groupId>se.jiderhamn</groupId>
<artifactId>classloader-leak-prevention</artifactId>
<version>1.15.2</version>
</dependency>
(即将发布的版本2中不需要):
web.xml
要了解有关可能导致此问题的第三方库的更多信息,并了解如何在自己的代码和外部库中调试此问题,请参阅this blog series of mine。