[英]Memory leak in Spring Boot 1.5.8
我观察到Spring Boot应用程序在生产环境中内存不足,以下是应用程序生成的异常日志。
stackTrace“:” java.lang.OutOfMemoryError:超出了GC开销限制\\ n包装:org.springframework.beans.factory.BeanCreationException:创建名称为“ org.springframework.context.annotation.internalConfigurationAnnotationProcessor”的bean时出错:bean的初始化失败; 嵌套的异常是java.lang.OutOfMemoryError:超出了GC开销限制\\ n \\ tat org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:564)\\ n \\ tat org.springframework.beans.factory.support .AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)\\ n \\ t org.springframework.beans.factory.support.AbstractBeanFactory $ 1.getObject(AbstractBeanFactory.java:306)\\ n \\ tat org.springframework.beans.factory.support。 DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)\\ n \\ t org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)\\ n \\ t ... 48帧被截断\\ n“}
我也将堆转储用于应用程序并使用MAT工具对其进行了分析,这是可疑的泄漏
我们无法弄清楚如何创建多个应用程序上下文。 理想情况下,这应该是一个单例。 这种行为在我们的本地环境中是不可行的。我们还依赖于Consul存储配置的地方。我也不理解为什么AnnotationConfigApplicationContext
对象没有被垃圾回收.Spring Boot中可能存在错误。
AbbstractApplicationContext$2
是由registerShutdownHook()
方法注册的匿名内部类。 如果要确认它,可以自己反编译该类。
看起来您已经注册了1,807,588,080个关闭钩子,将断点放置在registerShutdownHook()
然后调试发生了什么。 可能不是创建单个Spring上下文,而是创建多个新的Spring上下文,并且它们各自注册了一个关闭钩子线程。
我们发现弹簧云依赖关系存在问题,我们正在使用这些依赖关系从Consul获取应用程序配置。 它具有默认配置的手表,该手表每1000毫秒不断轮询一次领事服务器,并在发现配置中的任何更改时刷新应用程序上下文。我们通过将属性spring.cloud.consul.config.watch.enabled设置为false来禁用它来解决此内存泄漏问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.