Spring PermGen 空间问题

标签 spring memory weblogic

我遇到了一个非常严重的生产问题,我希望有人能提供帮助。

我正在使用 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 。使用这些参数是否有任何可能的负面影响?

所以,总结一下:
  • 我们的设置是否正确,如果不正确,它们应该是什么?
  • 使用 Spring 时服务器是否不可避免地会不时重新启动
    框架?
  • Spring 应该占用多少内存?有没有
    限制使用的类的方法?
  • 有没有可能的副作用
    使用 -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)
    

    最佳答案

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

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

    用于堆转储收集。
    -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:/opt/msp/log/gc.log` 
    

    GC 相关信息。

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

    关于Spring PermGen 空间问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11940267/

    相关文章:

    c - 正确释放结构的内存

    java.lang.InternalError : name is too long to represent

    java - SpringFramework 中的 Bean 内的 Bean?

    memory - 这个地址怎么能保存这么多数据呢?

    iphone - 从后台返回后,iOS应用程序因内存警告而崩溃,但之前没有?

    java - Weblogic 部署原因 - 创建名称为 'org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor#0' 的 bean 时出错

    java - 如何获取本地日期时间而不是服务器日期时间

    java - Spring——在命令行工具中使用注解事务管理

    java - 从 DataIntegrityViolationException 获取 SQL 异常消息

    java - Hibernate方法抛出 'java.lang.IllegalArgumentException'