Java 部署时出现PermGen错误Tomcat8/Spring Data/Hibernate
使用Tomcat8/SpringMVC/SpringDate/Hibernate处理webapp时,每隔几次部署到服务器上,甚至在java开发环境中保存,都会导致以下错误。有人知道我如何避免或解决这个问题吗?我尝试增加JVM以获得更多内存,但没有效果。Spring是使用java配置文件而不是旧的web.xml方法设置的Java 部署时出现PermGen错误Tomcat8/Spring Data/Hibernate,java,spring,hibernate,tomcat,permgen,Java,Spring,Hibernate,Tomcat,Permgen,使用Tomcat8/SpringMVC/SpringDate/Hibernate处理webapp时,每隔几次部署到服务器上,甚至在java开发环境中保存,都会导致以下错误。有人知道我如何避免或解决这个问题吗?我尝试增加JVM以获得更多内存,但没有效果。Spring是使用java配置文件而不是旧的web.xml方法设置的 [ContainerBackgroundProcessor[StandardEngine[Catalina]]]错误org.springframework.web.contex
[ContainerBackgroundProcessor[StandardEngine[Catalina]]]错误org.springframework.web.context.ContextLoader-上下文初始化失败
java.lang.OutOfMemoryError:PermGen空间
位于java.lang.ClassLoader.defineClass1(本机方法)
位于java.lang.ClassLoader.defineClass(ClassLoader.java:800)
位于java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
位于org.apache.catalina.loader.WebappClassLoaderBase.findClassInternal(WebappClassLoaderBase.java:2494)
位于org.apache.catalina.loader.WebappClassLoaderBase.findClass(WebappClassLoaderBase.java:860)
位于org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1302)
位于org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1167)
位于org.springframework.util.ConcurrentReferenceHashMap$EntrySet.iterator(ConcurrentReferenceHashMap.java:794)
位于java.util.AbstractMap$1$1。(AbstractMap.java:322)
位于java.util.AbstractMap$1.iterator(AbstractMap.java:321)
位于org.springframework.beans.CachedIntrospectionResults.clearClassLoader(CachedIntrospectionResults.java:164)
位于org.springframework.context.support.AbstractApplicationContext.resetCommonCaches(AbstractApplicationContext.java:881)
位于org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:563)
位于org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:446)
位于org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:328)
位于org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107)
位于org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4810)
位于org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5255)
位于org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
位于org.apache.catalina.core.StandardContext.reload(StandardContext.java:3831)
位于org.apache.catalina.loader.WebappLoader.backgroundProcess(WebappLoader.java:292)
位于org.apache.catalina.core.StandardContext.backgroundProcess(StandardContext.java:5616)
位于org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1377)
位于org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1381)
位于org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1381)
位于org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1349)
运行(Thread.java:745)
线程“ContainerBackgroundProcessor[StandardEngine[Catalina]]”java.lang.OutOfMemoryError:PermGen空间出现异常
我已经看到了Tomcat PermGen的其他问题,所以我首先尝试使用这些参数,看看在增加PermGen大小之前是否足够
-XX:+CMSClassUnloadingEnabled
-XX:+CMSPermGenSweepingEnabled
如果这不起作用,请检查以确保增加PermGen而不是堆大小。您可以使用以下JVM参数设置PermGen大小:
-XX:MaxPermSize=256M
这是因为您的应用程序没有完全取消部署。在开发环境中保存时会出现错误,因为这可能会触发应用程序的重新部署
这种错误很难调试,如果找到原因,您可能无法自行解决问题,因为您使用的库可能存在故障。有关跟踪此类错误的详细信息,请参见:
几年前我也遇到过同样的问题,结果在log4j中出现了问题。最后,我们采取了简单的方法,并决定重新启动应用程序服务器,而不是重新部署应用程序
事实上,这也是当今许多项目选择在每个appserver(或嵌入服务器)上部署一个应用程序,然后在更改后重新启动整个应用程序的原因之一
尽管如此,如果您有时间,跟踪这一点是值得的,因为它很可能是一个配置错误。您还可以了解很多关于应用程序及其运行时的信息。希望您可以通过将my添加到应用程序中来解决这个问题。在撰写本文时,这意味着Maven依赖性
<dependency>
<groupId>se.jiderhamn</groupId>
<artifactId>classloader-leak-prevention</artifactId>
<version>1.15.2</version>
</dependency>
要了解有关可能导致此问题的第三方库的更多信息,并了解如何在自己的代码和外部库中调试此问题,请参阅
<listener>
<listener-class>se.jiderhamn.classloader.leak.prevention.ClassLoaderLeakPreventor</listener-class>
</listener>