我偶然发现了一个非常奇怪的问题。每当Web应用程序启动时,dotnet.exe都具有相当不错的内存使用率(大约300M)。但是,当它触及某些部分时(我感觉它与EF Core的使用有关),它在很短的时间内分配了大量的内存(在2-3秒内大约8GB)。
此内存使用大约需要10-15秒,之后内存将稳定在600M左右,并且运行正常。
我尝试了dottrace和内置诊断工具,以了解分配如此多内存的内容,但找不到任何有意义的内容:
Dottrace是最耗费内存的线程,但是当我非常高时我无法捕捉到内存的快照(它只显示我约1GB的内存和大约800M的托管内存)。
VS诊断工具在基线之间和内存加标后立即增量
我怎样才能找到这种内存分配的根本原因?奇怪的是它似乎不是泄漏,因为内存最终被释放。
问题:如何解决ASP.NET Core 2.0应用程序EF Core使用中的大量内存分配问题?
我认为问题确实与注入服务的数量有关,但首先我将提供有关应用程序架构的更多信息。我依赖于一系列通用存储库,这些存储库注入了作用域数据访问,它在数据上下文中创建了一个包装器,并在需要时帮助在单个事务中保存多个信息(用于各种存储库):
Repository<T> : IRepository<T>
<- DbContext
ScopedDataAccess : IScopedDataAccess
<- DbContext
<- logging service
<- dozens of IRepository<T>
一切都是“范围”:
services.AddScoped<IScopedDataAccess, ScopedDataAccess>();
services.AddScoped(typeof(IRepository<>), typeof(Repository<>));
我在ScopedDataAccess
中删除了大约一半注入的存储库,并且所需的内存减少到大约一半。
更奇怪的是,诊断工具显示内存减少而没有直接绑定到GC(参见下图,GC是上面的黄色标记):
另外,我仔细检查了我已停止所有异步作业(例如Quartz)。