我正在努力解决内存问题,我可以肯定地看到,但我不知道它究竟发生在何处以及何时发生。
我的托管堆大小似乎没问题(100MB),但本机堆大小在未知时刻开始增长,它仍然会一直运行,直到它达到~2GB并且应用程序崩溃。
我的应用程序正在运行许多线程,它在许多循环中通过EF 6进行大量的Db连接。 这就是为什么我只是通过查看日志或提供断点来调试代码真的很难。
我想也许我可以通过查看内存来查看问题但是我只能看到我的本机堆大小主要由大小为8,192字节的对象填充。所以我可以看到问题确实发生了,但仍然不知道为什么。
我不确定我是否使用了Visual Studio内存分析器的100%功能 我现在能看到的是:
我还能做些什么来找到这个问题?
也许这是一个愚蠢的问题,但我正在解决这个问题两天,我几乎达到了我的想法限制。
我已经完成了断点,日志,代码分析,但我仍然没有任何线索。
我会感激任何想法。
[编辑] 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();
}