【问题标题】:Spring tool suite: Tomcat server constant permgenSpring工具套件:Tomcat服务器常量permgen
【发布时间】:2014-12-24 07:33:15
【问题描述】:

我正在使用 Spring sts。我希望我使用内部服务器向导添加的 Tomcat v7.0 服务器上的 web 应用程序。

由于服务器不断地自动重新部署(也许?这就是我的理解),因此服务器在编辑 java 文件时不断耗尽内存并引发 Permgen 错误。考虑到我没有安装自己的 tomcat 副本,有没有办法增加为此服务器分配的 permgen 空间?

任何帮助或澄清都会很棒。

如果有帮助,我添加了堆栈跟踪:

严重:后台线程意外死亡 ContainerBackgroundProcessor[StandardEngine[Catalina]] 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.WebappClassLoader.findClassInternal(WebappClassLoader.java:2957) 在 org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:1210) 在 org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1690) 在 org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1571) 在 org.apache.log4j.spi.LoggingEvent.(LoggingEvent.java:159) 在 org.apache.log4j.Category.forcedLog(Category.java:391) 在 org.apache.log4j.Category.log(Category.java:856) 在 org.slf4j.impl.Log4jLoggerAdapter.log(Log4jLoggerAdapter.java:602) 在 org.apache.commons.logging.impl.SLF4JLocationAwareLog.error(SLF4JLocationAwareLog.java:225) 在 org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:336) 在 org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:106) 在 org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4992) 在 org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5490) 在 org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 在 org.apache.catalina.core.StandardContext.reload(StandardContext.java:4007) 在 org.apache.catalina.loader.WebappLoader.backgroundProcess(WebappLoader.java:425) 在 org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1345) 在 org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1546) 在 org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1556) 在 org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1556) 在 org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1524) 在 java.lang.Thread.run(Thread.java:745) 线程“ContainerBackgroundProcessor[StandardEngine[Catalina]]”中的异常 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.WebappClassLoader.findClassInternal(WebappClassLoader.java:2957) 在 org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:1210) 在 org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1690) 在 org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1571) 在 org.apache.log4j.spi.LoggingEvent.(LoggingEvent.java:159) 在 org.apache.log4j.Category.forcedLog(Category.java:391) 在 org.apache.log4j.Category.log(Category.java:856) 在 org.slf4j.impl.Log4jLoggerAdapter.log(Log4jLoggerAdapter.java:602) 在 org.apache.commons.logging.impl.SLF4JLocationAwareLog.error(SLF4JLocationAwareLog.java:225) 在 org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:336) 在 org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:106) 在 org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4992) 在 org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5490) 在 org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 在 org.apache.catalina.core.StandardContext.reload(StandardContext.java:4007) 在 org.apache.catalina.loader.WebappLoader.backgroundProcess(WebappLoader.java:425) 在 org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1345) 在 org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1546) 在 org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1556) 在 org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1556) 在 org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1524) 在 java.lang.Thread.run(Thread.java:745)

谢谢你:)

【问题讨论】:

  • 我正在寻找一个类似的问题 - 请参阅 stackoverflow.com/questions/31211868/… - 并想问一下 log4j 或 log4j2 的配置是否与您发现的泄漏有关。
  • 我从来没有解决过这个问题。但根据我的日志,可能是使用的 JDBC 驱动程序导致了问题。我不认为 log4j 配置是原因。

标签: eclipse spring-mvc spring-tool-suite


【解决方案1】:

确实可以增加永久空间,这至少会推迟OutOfmemoryError: Permgen space。就像添加(或增加)一个类似于以下示例的参数一样简单,为 permgen 空间分配 512m:

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

根据您的描述,尽管我确实认为您的应用程序包含类加载器泄漏,这是在重新部署期间发生的。如果我的想法是正确的,那么增加永久空间只会推迟不可避免的事情,而不是解决根本问题。要解决此问题,您可以进行堆转储并分析内容或使用专用工具,例如Plumbr memory leak detector

完全披露,我隶属于 Plumbr。

【讨论】:

    【解决方案2】:

    我认为您可以配置重新部署行为并避免在服务器编辑器中不断重新部署。除此之外,您还应该能够在服务器的启动配置中设置 permgen vm 选项(运行 -> 运行配置...)。

    【讨论】:

      猜你喜欢
      • 2015-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-26
      • 2013-08-18
      • 2014-10-04
      • 2012-11-04
      • 2011-04-01
      相关资源
      最近更新 更多