调试

时间:2017-03-15 13:54:50

标签: c# visual-studio-2015 entity-framework-6

我正在运行一个非常小的程序,当显然有大量可用内存时会抛出“System.OutOfMemoryException”:

VS Diagnostic Tool

在任务管理器下,我留下了足够的内存,这个过程大约需要45MB。

有没有办法增加此进程内存限制?

EDIT1:

我移动了一些代码,这使错误在许多不同的地方被触发。最新的,在加载表单并用数据库中的数据填充之后,我只是在TabControl中从一个选项卡更改为另一个选项卡,并触发异常。

我正在使用Entity Framework 6和Postgres数据库,如果这有帮助的话。也许框架正在创建太多的对象实例,而且我的内存索引用完了。

这就是为什么我认为代码本身与问题无关。

EDIT2:

我在异常发生之前和之后拍摄了内存分析器的另一个屏幕截图:

enter image description here

所以问题是我在内存中获得了超过100K的对象,而且我没有足够的内存页来创建新的对象?我仍然很失落如何处理这个问题。

EDIT3:

好吧,我发现了内存泄漏的罪魁祸首:Entify Framework。在我第一次从数据库加载数据后,会发生内存消耗增加。现在,如果问题出在Postgre驱动程序或Entity Framework本身,我将不得不正确调试。将不得不用不同的数据库进行测试来检查。

这是两个屏幕截图,显示了使用EF之前和之后的差异。代码将两个组合框中的一些项加载,两个组合使用相同的List作为数据源。在第一个例子。我有EF,第二次我加载了相同类型的对象,但是自己创建它们,没有连接到数据库。差别是惊人的!

Memory Leak using EF6 Same code, no EF6

编辑4:

嗯,这很令人尴尬。我转向了另一种解决方案。现在我正在使用Simple.Migration管理数据库中的更改,而Dapper(使用Dapper.Contrib)则处理CRUD。希望他们看到这个,也许看看出了什么问题......

1 个答案:

答案 0 :(得分:0)

内存用法可能与内存保留不同。系统可以保留内存(它说“我有那个兆字节的dib”)但实际上没有使用它。我不确定Visual Studio是显示内存使用情况还是保留,但您可以通过任务管理器检查它,转到性能选项卡,然后单击窗口底部附近的资源监视器按钮。 “资源监视器”窗口中的“内存”选项卡将显示提交的内存量。

如果你遇到这个问题,而且我打赌你这样做,那么你会反复声明某些内容而不是实例化或删除它,或者你正在向列表中添加无限的对象。它最有可能发生在循环中。除非您的计算机是土豆,否则Visual Studio不太可能达到内存限制。