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

时间:2017-02-03 12:38:32

标签: c# entity-framework visual-studio memory-leaks

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

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

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

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

我不确定我是否使用了Visual Studio内存分析器的100%功能 我现在能看到的是: Snapshot of Native Heap

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

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

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

我会感激任何想法。

[编辑] 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;
        }
    }
}

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

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

1 个答案:

答案 0 :(得分:1)

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

怎么办?

  1. 使用探查器启动应用程序。

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

  3. 重复您在步骤2中执行的相同步骤,并拍摄另一张快照。
  4. 停止申请。您应该看到2个快照,单击2ns快照并选择Compare to #Snapshot 1。 处理结果可能需要一些时间。
  5. 您应该能够在报告中看到更少的其他列(标识符,计数,大小,模块,计算差异。大小差异 最后两列很重要。它们告诉哪个类第二次使用更多/更少的内存。
  6. 总结一下......你需要找出内存泄漏的位置并修复它。你会通过比较快照来做到这一点。

    enter image description here