我观察Spring Boot应用程序在生产环境中的内存不足,以下是应用程序生成的异常日志。
stackTrace":" java.lang.OutOfMemoryError:GC开销限制 超过\ n包裹: org.springframework.beans.factory.BeanCreationException:错误 用名字创建bean ' org.springframework.context.annotation.internalConfigurationAnnotationProcessor&#39 ;: bean的初始化失败;嵌套异常是 java.lang.OutOfMemoryError:GC开销限制超过\ n \ tat org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:564)\ n \达 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)\ n \达 org.springframework.beans.factory.support.AbstractBeanFactory $ 1.getObject(AbstractBeanFactory.java:306)\ n \达 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)\ n \达 org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)\ n \ t ... 48帧被截断\ n"}
我还使用堆转储进行应用并使用MAT工具进行分析,这是可疑的泄漏
我们无法弄清楚如何创建多个应用程序上下文。理想情况下,这应该是单身人士。这种行为在我们的本地环境中无法生成。我们也依赖于Consul我们正在存储配置。我也不明白为什么AnnotationConfigApplicationContext
的对象没有被垃圾收集。在Spring Boot中可能存在bug
答案 0 :(得分:5)
AbbstractApplicationContext$2
是由registerShutdownHook()
方法注册的匿名内部类。如果要确认,可以自行反编译该类。
看起来你已经注册了1,807,588,080个关闭钩子,在registerShutdownHook()
中放置一个断点并调试正在进行的操作。可能是您正在创建多个新的Spring上下文而不是单个Spring上下文,并且它们每个都注册一个关闭钩子线程。
答案 1 :(得分:0)
我们发现问题与Spring Cloud依赖关系有关,我们正在使用这些依赖关系从Consul获取应用程序配置。它具有默认配置的监视功能,该监视功能每1000ms持续轮询一次领事服务器,并在发现配置中的任何更改时刷新应用程序上下文。我们通过设置属性 spring.cloud.consul.config.watch.enabled < / strong>设置为false即可解决此内存泄漏问题。