【问题标题】:Entity Framework Memory Leak实体框架内存泄漏
【发布时间】:2016-04-02 07:34:44
【问题描述】:

我正在通过 dotMemory JetBrains 监控软件内存的消耗情况。

我注意到,当我通过我的存储库进行查询时,如果我关闭窗口,我已经离开了我从中进行调用的对象;我的存储库到内存中,我使用了甚至处理了我的上下文,但没有任何东西留在内存中。我可以检查什么?

这是有问题的代码:

LoginViewModel.cs

using (DbContext = new Context())
{
   var creazioneDocumentoRepository = new RepositoryBase<CreazioneDocumento>(ctx);
   var creazioneDocumento = creazioneDocumentoRepository.Lista();

   if (creazioneDocumento == null || creazioneDocumento.Count == 0) 
      return;

   var decimaliQuantita = creazioneDocumento.Max(x => x.NumeroDecimaliQuantita);
   _NumeroDecimaliQuantita = decimaliQuantita != 0 && decimaliQuantita > 0 ? decimaliQuantita : 0;

   var decimaliPrezzo = creazioneDocumento.Max(x => x.NumeroDecimaliPrezzo);
   _NumeroDecimaliPrezzo = decimaliPrezzo != 0 && decimaliPrezzo > 0 ? decimaliPrezzo : 3;
   _NumeroDecimaliImponibile = 2;

   //   ctx.Dispose();
}

在调试时,我注意到:

if (creazioneDocumento == null || creazioneDocumento.Count == 0) return;

对象不会被记住,但只要我运行“max”,对象就会保留在内存中。

这是来自 dotmemory 的屏幕截图:

相反,这个屏幕截图告诉我哪些方法可以引用并保存在我的 loginviewmodel 内存中,我相信它们是最大的两个:

【问题讨论】:

  • 你知道你没有在 GC 环境中证明内存泄漏吗?您所做的只是证明尚未进行垃圾收集的对象还没有内存不足。在进行第二次测量之前,您错过了 GC 运行的证明。投票结束 - 无法复制。
  • @TomTom 当 dotMemory 获取快照时,它会执行完整的垃圾回收,因此如果内存中有对象,则意味着它们被某些根持有。 Brux88:我看到不是 LoginViewModel 本身的实例,而是一些带有闭包的 lambda 实例由其他一些代表保存在内存中。如果没有 LoginViewModel 类的源代码,就不可能再说什么了。
  • 其实和我想的一样。但我不明白如何释放内存。问题是当我执行此行时: var decimaliQuantita = creazioneDocumento.Max(x => x.NumeroDecimaliQuantita); .....我该如何解决?
  • 在网上看的,我找到了这篇文章:blog.jetbrains.com/dotnet/2014/07/24/… 所以我认为问题表达式 lambda 翼,它是保留在内存中。这是正确的?我使用了很多 lambda 表达式,我该如何解决? daverro 在使用 lambda 保留所有这些内存对象时遇到问题?

标签: c# entity-framework memory-leaks


【解决方案1】:

.NET CLR 是一个托管的、垃圾收集的运行时/虚拟机。

您不能指望对象会在不需要时立即被回收并从内存中删除。

另一方面,IDisposable.Dispose 只是定义代码以释放实现所使用的底层资源的接口方法:它不是释放内存的内置方法。

垃圾收集器 (GC) 将内存作为后台进程回收,它不会立即删除任何内容,而是基于超时的假设。

延伸阅读:Understanding garbage collection in .NET

【讨论】:

  • 此外,使用 IDisposable.Dispose 您应该确保释放非托管资源。但是在您的情况下,您有一个连接到池中的 DBMS,因此不会释放连接和相关资源。对于托管对象,如果您运行压力测试并分析内存,您可能会看到锯齿形状。
  • 内存分析器执行完整的垃圾回收以获得内存快照
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-05
  • 2011-05-29
  • 1970-01-01
相关资源
最近更新 更多