繁体   English   中英

PermGen错误Tomcat8 / Spring数据/部署时休眠

[英]PermGen Error Tomcat8 / Spring Data /Hibernate on Deploy

使用Tomcat8 / Spring MVC / Spring Date / Hibernate使用webapp时,每少数部署到服务器甚至保存在Java开发环境中的应用程序都会导致以下错误。 有人知道我可以避免或解决此问题吗? 我尝试增加JVM来获得更多内存而无济于事。 使用Java配置文件而不是旧的web.xml方法设置Spring

 [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 

我还看到了其他Tomcat PermGen问题,因此在增加PermGen大小之前,我会首先尝试使用这些args来查看是否足够。

-XX:+CMSClassUnloadingEnabled 
-XX:+CMSPermGenSweepingEnabled

如果这样不起作用,请检查以确保增加PermGen而不是增加堆大小。 您可以使用以下JVM arg设置PermGen大小: -XX:MaxPermSize=256M

发生这种情况是因为您的应用程序无法彻底取消部署。 在开发环境中保存时会出现错误,因为这可能会触发应用程序的重新部署。

这种错误确实很难调试,如果您找到原因,则可能无法独自解决问题,因为您使用的库可能有问题。 可以在以下网址找到有关跟踪此类错误的很好的阅读: https : //plumbr.eu/blog/memory-leaks/hunting-down-memory-leaks-a-case-study

几年前我遇到过同样的问题,事实证明这是log4j中的问题。 最后,我们采取了简单的方法,并决定重新启动应用程序服务器,而不是重新部署应用程序。

实际上,这是当今许多项目选择在每个应用服务器上部署一个应用程序(或嵌入服务器)并在更改后重新启动整个过程的原因之一。

尽管如此,如果有时间,值得追踪一下,因为它很可能是配置错误。 您会学到很多有关您的应用及其运行时的知识。

希望您可以通过将我的ClassLoader Leak Prevention库添加到您的应用程序来解决此问题。 在撰写本文时,这意味着该Maven依赖项

<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>

要了解有关可能导致此问题的第三方库的更多信息,并了解如何在自己的代码和外部库中进行调试,请参阅我的博客系列

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM