Spring Boot 1.5.8中的内存泄漏

时间:2018-05-31 08:37:43

标签: java spring spring-boot

我观察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工具进行分析,这是可疑的泄漏 MAT Heap Dump Analyzer Output

我们无法弄清楚如何创建多个应用程序上下文。理想情况下,这应该是单身人士。这种行为在我们的本地环境中无法生成。我们也依赖于Consul我们正在存储配置。我也不明白为什么AnnotationConfigApplicationContext的对象没有被垃圾收集。在Spring Boot中可能存在bug

2 个答案:

答案 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即可解决此内存泄漏问题。