破坏内存泄漏VS2015。 大规模的本机堆

我正在努力解决内存问题,我可以肯定地看到,但我不知道它究竟发生在何处以及何时发生。

我的托管堆大小似乎没问题(100MB),但是本机堆大小在未知时刻开始增长,它仍然会一直运行,直到它达到~2GB并且应用程序崩溃。

我的应用程序正在运行许multithreading,并且它在很多循环中通过EF 6进行大量的Db连接。 这就是为什么我只是通过查看日志或提供断点来调试代码真的很难。

我想也许我可以通过查看内存来看到问题,但只有我能看到的是我的本机堆大小主要由大小为8,192字节的对象填充。 所以我可以看到问题确实发生了,但仍然不知道为什么。

我不确定我是否使用Visual Studio内存分析器的100%function。
我现在能看到的是: 原生堆快照

我还能做些什么来找到这个问题?

也许这是一个愚蠢的问题,但我正在解决这个问题两天,我几乎达到了我的想法限制。

我已经通过了断点,日志,代码分析,但我仍然没有任何线索。

我会感激任何想法。

[编辑] 2017年2月15日15:11

我能够找到负责泄漏的代码,但对我来说仍然没有意义。 这段代码如何导致大量内存泄漏?

代码是:

public class DbData : IDisposable { private DBEntity db; public DbData() { db = new FruitDBEntity(); } public Fruit AddFruitDefinition(Fruit fruit) { lock (thisLock) { var newFruit = db.Fruits.Where(f => f.FruitId == fruit.FruitId) .Where(f => f.FruitName == fruit.FruitName) .Where(f => f.FruitColor == fruit.FruitColor) .FirstOrDefault(); if (newFruit == null) { newFruit = db.Fruits.Add(fruit); db.SaveChanges(); } return newFruit; } } } 

每次我想使用AddFruitDefinition()方法时AddFruitDefinition()创建DbData类:

 using ( var data = new DbData() ) { data.AddFruitDefinition(); } 

首先,您至少需要两个快照。 据我所知(从图像)你只拍了一张快照。

该怎么办?

  1. 使用分析器启动应用程序。

  2. 做常规步骤并拍摄快照。

  3. 重复您在步骤2中执行的相同步骤,并拍摄另一个快照。
  4. 停止申请。 您应该看到2个快照,单击2ns快照并选择Compare to #Snapshot 1.处理结果可能需要一些时间。
  5. 您应该能够在报告中看到一些额外的列(标识符,计数,大小,模块, 计数差异。大小差异。最后两列很重要。它们告诉哪个类第二次使用更多/更少的内存。

总结一下……你需要找出内存泄漏的位置并修复它。 你会通过比较快照来做到这一点。

在此处输入图像描述