【发布时间】:2017-06-20 20:11:46
【问题描述】:
我正在努力解决我肯定可以看到的内存问题,但我不知道它究竟发生在何时何地。
我的托管堆大小似乎还可以(100MB),但本机堆大小在未知时刻开始增长,并且一直持续到大约 2GB 并且应用程序崩溃。
我的应用程序正在运行许多线程,并且它在许多循环中通过 EF 6 进行大量 Db 连接。 这就是为什么我很难仅通过查看日志或设置断点来调试代码。
我想也许我可以通过查看内存来了解问题所在,但只有我能看到的是我的本机堆大小主要由大小为 8,192 字节的对象填充。所以我可以看到这个问题确实发生了,但仍然不知道为什么。
我不确定我是否正在使用 Visual Studio 内存分析器的 100% 功能。
我现在可以看到的是:
我还能做些什么来找出问题?
也许这是个愚蠢的问题,但我正在研究这个问题两天,我几乎达到了我的想法极限。
我已经经历了断点、日志、代码分析,但我仍然没有任何线索。
如有任何想法,我将不胜感激。
[编辑] 2017/02/03 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()时都会创建类DbData:
using ( var data = new DbData() )
{
data.AddFruitDefinition();
}
【问题讨论】:
-
您可以尝试注释掉一些循环(如有必要,伪造数据)以尝试隔离导致问题的代码部分。也许你没有正确处理一些数据库对象......
-
如果你知道 Debug Diag,它的泄漏跟踪功能可以很容易地分辨出哪个原生库对 Native 泄漏负责。
-
@RenéVogt :我能够找到该代码片段。但它看起来很正常。我不知道这里会出现什么问题。
-
这只是一个猜测,因为我对 ef 没有经验:
DbData.Dispose()是否调用db.Dispose()? (不确定它是否会改变任何东西,只是猜测) -
所以我没有想法,但请不要打电话给
GC.Collect(),如果你将未发布的对象推到更高的阶段,这肯定会让事情变得更糟。
标签: c# entity-framework visual-studio memory-leaks