Spring PermGen Space Problem

I had a pretty serious performance issue, and I was hoping someone could help.

I am using Spring 3.1.0 and am impressed with its features.

Everything was in order during development. Unfortunately, when deployed in production, we ran into some problems.

We get PermGen memory space due to memory errors.

In our dev / test window, we have the following settings: -Xms2048m -Xmx2048m -XX: PermSize = 512 m -XX: MaxPermSize = 1024 m (note that we are not sure that these are the correct settings)

In our production box, we have the following settings: -Xms3056m -Xmx3056m -XX: PermSize = 128m -XX: MaxPermSize = 512m (please note again that we are not sure that these are the correct settings)

Admittedly, the production environment is completely different in that it runs a lot more applications.

According to what I read here , we have to set max and min to the same value, and maxpermsize is 1/4 of one of them.

I read in several places (including here ) that it may be inevitable to restart the server due to leaks. Does anyone know if this is true?

Also, does anyone know how much memory the Spring framework typically needs? After deploying the application, I found that the amount of memory used was increasing by about 345 MB. I understand that when you start the application, you need to create several classes, but this seems like a lot. Is something wrong with me? We use only Spring JDBC. Is there a way to limit the scope to only these classes?

Our code base is quite large, and I understand that JAXB can cause serious problems .

I saw recommendations for use

-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled 

here and here . Are there any possible negative side effects for using these arguments?

So, we summarize:

  • Are the settings correct, and if not, what should they be?

  • Server restarts from time to time, inevitably with Spring framework?

  • How much memory should Spring take? Is there a way to limit the classes used?

  • Are there any possible side effects to using -XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled ?

Any help is appreciated. Thanks in advance.

The stack trace is lower (there is more, but I cannot publish it all):

 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) 
+6
source share
2 answers

To see the permGen virtual machine, you can look at the MemoryPool MBean in JConsole. Alternatively, you can add the following JVM arguments (in case you haven't already)

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

for the heapdumps collection.

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

for information related to the GC.

This will help to understand the structure of the garbage collection and help you come up with better limits.

+4
source

It is difficult to say how much memory is optimal for the production environment. -Xms does not have to be equal to (or equal to -Xmx). You can set it to a lower value, but increase the value -XX: PermSize. In addition, in order to achieve optimal values, you should try and verify that it gives optimal results.

0
source

Source: https://habr.com/ru/post/922762/


All Articles