【问题标题】:Spring PermGen space issueSpring PermGen 空间问题
【发布时间】:2012-08-10 00:49:30
【问题描述】:

我遇到了一个非常严重的制作问题,我希望有人能帮忙。

我正在使用 Spring 3.1.0,并对其功能印象深刻。

在开发过程中,一切都很好。不幸的是,在部署到生产环境时,我们遇到了一些问题。

PermGen space out of memory 错误。

在我们的开发/测试盒上,我们有以下设置: -Xms2048m -Xmx2048m -XX:PermSize=512m -XX:MaxPermSize=1024m(请注意,我们确信这些设置是正确的)

在我们的生产盒上,我们有以下设置: -Xms3056m -Xmx3056m -XX:PermSize=128m -XX:MaxPermSize=512m(再次请注意,我们确信这些设置是否正确)

诚然,生产环境完全不同,因为它运行着更多的应用程序。

根据我读到的here,我们应该将 max 和 min 设置为相同的值,并将 maxpermsize 设置为其中任何一个的 1/4。

我在多个位置(包括here)读到,由于泄漏可能无法避免重新启动服务器。有人知道这是不是真的吗?

另外,有人知道 Spring 框架通常需要多少内存吗?部署应用程序后,我发现使用的内存量增加了大约 345 MB。我知道在应用程序启动时需要实例化许多类,但这似乎很多。我有什么设置不正确吗?我们目前只使用 Spring JDBC。有什么方法可以将框架限制在这些类中吗?

我们的代码库相当大,我知道JAXB can cause serious problems

我看到了使用建议

-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled

herehere。使用这些参数是否有任何可能的负面影响?

所以,总结一下:

  1. 我们的设置是否正确,如果不正确,应该是什么?

  2. Spring 是否不可避免地会不时重启服务器 框架?

  3. Spring 应该占用多少内存?有没有 如何限制使用的类?

  4. 是否有任何可能的副作用 使用-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled ?

我们将不胜感激任何和所有的帮助。提前致谢。

堆栈跟踪如下(还有更多,但我无法全部发布):

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter': Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter]: Constructor threw exception; nested exception is java.lang.OutOfMemoryError: PermGen space
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:997)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:943)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:485)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:286)
    at org.springframework.web.servlet.DispatcherServlet.createDefaultStrategy(DispatcherServlet.java:788)
    at org.springframework.web.servlet.DispatcherServlet.getDefaultStrategies(DispatcherServlet.java:757)
    at org.springframework.web.servlet.DispatcherServlet.initHandlerAdapters(DispatcherServlet.java:565)
    at org.springframework.web.servlet.DispatcherServlet.initStrategies(DispatcherServlet.java:422)
    at org.springframework.web.servlet.DispatcherServlet.onRefresh(DispatcherServlet.java:410)
    at org.springframework.web.servlet.FrameworkServlet.onApplicationEvent(FrameworkServlet.java:752)
    at org.springframework.web.servlet.FrameworkServlet$ContextRefreshListener.onApplicationEvent(FrameworkServlet.java:989)
    at org.springframework.web.servlet.FrameworkServlet$ContextRefreshListener.onApplicationEvent(FrameworkServlet.java:1)
    at org.springframework.context.event.GenericApplicationListenerAdapter.onApplicationEvent(GenericApplicationListenerAdapter.java:51)
    at org.springframework.context.event.SourceFilteringListener.onApplicationEventInternal(SourceFilteringListener.java:97)
    at org.springframework.context.event.SourceFilteringListener.onApplicationEvent(SourceFilteringListener.java:68)
    at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:97)
    at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:324)
    at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:929)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:467)
    at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:631)
    at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:588)
    at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:645)
    at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:508)
    at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:449)
    at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:133)
    at javax.servlet.GenericServlet.init(GenericServlet.java:241)
    at weblogic.servlet.internal.StubSecurityHelper$ServletInitAction.run(StubSecurityHelper.java:283)
    at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
    at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:121)
    at weblogic.servlet.internal.StubSecurityHelper.createServlet(StubSecurityHelper.java:64)
    at weblogic.servlet.internal.StubLifecycleHelper.createOneInstance(StubLifecycleHelper.java:58)
    at weblogic.servlet.internal.StubLifecycleHelper.<init>(StubLifecycleHelper.java:48)
    at weblogic.servlet.internal.ServletStubImpl.prepareServlet(ServletStubImpl.java:539)
    at weblogic.servlet.internal.WebAppServletContext.preloadServlet(WebAppServletContext.java:1976)
    at weblogic.servlet.internal.WebAppServletContext.loadServletsOnStartup(WebAppServletContext.java:1950)
    at weblogic.servlet.internal.WebAppServletContext.preloadResources(WebAppServletContext.java:1869)
    at weblogic.servlet.internal.WebAppServletContext.start(WebAppServletContext.java:3126)
    at weblogic.servlet.internal.WebAppModule.startContexts(WebAppModule.java:1512)
    at weblogic.servlet.internal.WebAppModule.start(WebAppModule.java:486)
    at weblogic.application.internal.flow.ModuleStateDriver$3.next(ModuleStateDriver.java:425)
    at weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:41)
    at weblogic.application.internal.flow.ModuleStateDriver.start(ModuleStateDriver.java:119)
    at weblogic.application.internal.flow.ScopedModuleDriver.start(ScopedModuleDriver.java:200)
    at weblogic.application.internal.flow.ModuleListenerInvoker.start(ModuleListenerInvoker.java:247)
    at weblogic.application.internal.flow.ModuleStateDriver$3.next(ModuleStateDriver.java:425)
    at weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:41)
    at weblogic.application.internal.flow.ModuleStateDriver.start(ModuleStateDriver.java:119)
    at weblogic.application.internal.flow.StartModulesFlow.activate(StartModulesFlow.java:27)
    at weblogic.application.internal.BaseDeployment$2.next(BaseDeployment.java:1267)
    at weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:41)
    at weblogic.application.internal.BaseDeployment.activate(BaseDeployment.java:409)
    at weblogic.application.internal.EarDeployment.activate(EarDeployment.java:58)
    at weblogic.application.internal.DeploymentStateChecker.activate(DeploymentStateChecker.java:161)
    at weblogic.deploy.internal.targetserver.AppContainerInvoker.activate(AppContainerInvoker.java:79)
    at weblogic.deploy.internal.targetserver.operations.AbstractOperation.activate(AbstractOperation.java:569)
    at weblogic.deploy.internal.targetserver.operations.ActivateOperation.activateDeployment(ActivateOperation.java:150)
    at weblogic.deploy.internal.targetserver.operations.ActivateOperation.doCommit(ActivateOperation.java:116)
    at weblogic.deploy.internal.targetserver.operations.StartOperation.doCommit(StartOperation.java:143)
    at weblogic.deploy.internal.targetserver.operations.AbstractOperation.commit(AbstractOperation.java:323)
    at weblogic.deploy.internal.targetserver.DeploymentManager.handleDeploymentCommit(DeploymentManager.java:844)
    at weblogic.deploy.internal.targetserver.DeploymentManager.activateDeploymentList(DeploymentManager.java:1253)
    at weblogic.deploy.internal.targetserver.DeploymentManager.handleCommit(DeploymentManager.java:440)

【问题讨论】:

  • Re:"2.Spring框架下服务器时不时重启是不可避免的吗?" - 不 - 我们在产品环境中使用 Spring 3.0.4,我们没有任何内存问题。它可能是您正在使用的其他库之一吗?我们遇到了一个 weblogic jar 与 xmlbeans 冲突并导致 OOM 的问题
  • 我们有一个带有 PermGen 的 OOM,初始值为 128,因此我们将其设置为 256,这让我们保持良好状态。我可以在 dev 上看到你已经给了 512,你能在 Prod 上做一个 256 的首字母吗?另一条轨道是检查 PermGen 的内容,如 stackoverflow.com/questions/4080010/how-to-dump-permgenstackoverflow.com/questions/2842982/…
  • 我用 JVisualVM 做了一些分析,但无法看到烫发空间中的对象。我们尝试将生产设置更改为 3 GB 的堆大小和 1 GB 的最大 perm 大小,这 似乎 现在已经解决了这个问题。我一定会查看您发布的链接,因为这在将来可能会有用。谢谢。
  • 好的,如果你在 32 位操作系统和 JVM 上,3 GB 堆是最高的,为 perm 添加 1 Gb 是额外的 JVM 内存空间寻址 - imo 有点冒险。如果您使用的是 62 位操作系统和 JVM,那么一切都很酷
  • 这是一个 64 位系统,真是个好消息。谢谢!

标签: spring memory weblogic


【解决方案1】:

要查看 permGen VM,您可以查看 JConsole 中的MemoryPool MBean。此外,您可以添加以下 JVM 参数(如果您还没有)

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/msp/log 

用于堆转储收集。

-XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:/opt/msp/log/gc.log` 

获取 GC 相关信息。

这将有助于理解垃圾收集模式,并可能指导您提出更好的限制。

【讨论】:

    【解决方案2】:

    很难说有多少内存最适合生产环境。 -Xms 不必相等(或与 -Xmx 一样高)。您可以将其设置为较低的值,但增加 -XX:PermSize 的值。此外,为了得出最佳值,您应该尝试进行基准测试,看看哪些值会产生最佳结果。

    【讨论】:

      猜你喜欢
      • 2014-06-21
      • 2011-07-27
      • 1970-01-01
      • 2013-12-23
      • 2011-09-04
      • 2013-03-08
      • 1970-01-01
      相关资源
      最近更新 更多