Nat*_*tan 7 c# memory-leaks entity-framework dependency-injection
我在.NET 4.6.2上有一个Windows服务,我使用.NET ServiceProvider(System.IServiceProvider接口)将EF6 DbContext注册为Transient .该服务开始使用大约30mb的内存,一天后达到1Gb.
在进程上运行一个探查器告诉我等待释放的数十万个DbContext对象,即使我在每次使用后都处理了上下文.
以下是代码示例:
// registration
var services = new ServiceCollection();
services.AddTransient(sp => new ServiceDbContext(connectionString));
var serviceProvider = services.BuildServiceProvider();
// use
using (var ctx = serviceProvider.GetRequiredService<ServiceDbContext>()) { ... }
Run Code Online (Sandbox Code Playgroud)
将AsNoTracking添加到查询会减少内存使用量,但上下文仍然永远存在于内存中.似乎ServiceProvider没有任何发布方法.
这是一个示例对象树,通过运行服务几分钟,然后让它闲置几分钟.4838是我实例化上下文的次数.注意我在闲置几分钟之后强制GC进行此拍摄:
除了处理它之外,我还有什么办法可以释放上下文吗?或者这是内置服务提供商的一些限制?
好的,这看起来像是 ServiceProvider 当前实现中的一个错误,由于某种原因,它跟踪根上下文中的一次性资源。
https://github.com/aspnet/DependencyInjection/issues/456