使用Entity Framework时内存泄漏
我有一个使用EF的非常简单的应用程序。 但是当它运行一周时,内存使用率很差(一开始只有80MB,一周后只有700MB)。 当我使用dotMemory来分析我的应用程序时。 我发现Heap第2代的记忆一直在增加。
我得到一个快照,最后发现ef dbcontext的保留字节是最多的。
我感到很困惑。 我的申请很简单。 代码示例:
protected CarbonBrushMonitorEntities _entities = new MYEntities(); public void Add(HistoryData data) { _entities.HistoryDatas.Add(data); _entities.SaveChanges(); }
_entities
只在开始时间_entities
一次,然后一直使用。
经常调用Add
函数,大约3次/秒
我谷歌很长一段时间,并尝试一些方法,如:
_entities.Configuration.ValidateOnSaveEnabled = false; _entities.Configuration.AutoDetectChangesEnabled = false; _entities.Configuration.LazyLoadingEnabled = false;
但这些都行不通。
如果使用entity framework,则应在需要之前创建上下文并尽快处理它 :
using (var someContext = new SomeContext()) { // your commands/queries }
切勿将内容保留在内存中或在不同的呼叫中共享。
我通常做的是使用IoC容器注册上下文:
DependencyFactory.RegisterType(typeof(SomeContext));
并使用上下文解析器(当然也在IoC中注册),如:
using (var someContext = _contextResolver.ResolveContext()) { // your commands/queries }
分辨率如下:
public class ContextResolver : IContextResolver { public ISomeContext ResolveContext() { return DependencyFactory.Resolve(); } }
EF上下文实际上是您的工作单元,一旦您不再需要它就应该被处理掉。