记录一次遇到的内存超标问题(OverlappedData)
问题描述
在系统的运行过程中发现内存占用在不断提高,通过性能分析工具发现,每一次请求都会造成OverlappedData的计数加1,且内存占用增大
问题成因
在NET CORE中,我们通常采用new ConfigurationBuilder()的方式获得配置文件信息,一般来讲,会将配置文件注入到容器中,后续直接从容器获取单一实例即可。
本次发现的问题是因为在某个业务代码中,自行通过new ConfigurationBuilder()的方式获取配置文件,而这些数据并不会被GC回收而是一直托管在OverlappedData中,最后导致内存溢出。
解决方案
从容器中获取配置文件
第二个问题
系统中使用到了一个获取数据库链接的工厂,通过内存分析,发现工厂以及工厂产生的数据库链接对象一直没有被释放
成因分析
业务代码本身是Quartz的一个Job,无法通过构造函数的形式获取到IOC容器的示例,因此新建了一个容器,将需要的服务注册到这个容器,然后将容器存储为静态变量供业务类调用。
业务类获取的服务实例都是由这个容器提供的。由于这个容器不会被销毁,导致其持有的所有服务实例也不会被销毁。
解决方案
获取实例时,调用静态容器的BeginLifetimeScope新建一个服务范围,也就是生成了一个子容器,再通过子容器获取服务实例。当Job对象完成并销毁时,子容器销毁,其持有的服务实例也被销毁。
IOC可能存在的内存问题
不要在一个Singleton的实例的构造函数中引用Scoped范围的服务,因为Singleton的服务不会释放,导致Scoped范围的服务也无法释放。
浙公网安备 33010602011771号