【发布时间】:2016-04-02 07:34:44
【问题描述】:
我正在通过 dotMemory JetBrains 监控软件内存的消耗情况。
我注意到,当我通过我的存储库进行查询时,如果我关闭窗口,我已经离开了我从中进行调用的对象;我的存储库到内存中,我使用了甚至处理了我的上下文,但没有任何东西留在内存中。我可以检查什么?
这是有问题的代码:
LoginViewModel.cs
using (DbContext = new Context())
{
var creazioneDocumentoRepository = new RepositoryBase<CreazioneDocumento>(ctx);
var creazioneDocumento = creazioneDocumentoRepository.Lista();
if (creazioneDocumento == null || creazioneDocumento.Count == 0)
return;
var decimaliQuantita = creazioneDocumento.Max(x => x.NumeroDecimaliQuantita);
_NumeroDecimaliQuantita = decimaliQuantita != 0 && decimaliQuantita > 0 ? decimaliQuantita : 0;
var decimaliPrezzo = creazioneDocumento.Max(x => x.NumeroDecimaliPrezzo);
_NumeroDecimaliPrezzo = decimaliPrezzo != 0 && decimaliPrezzo > 0 ? decimaliPrezzo : 3;
_NumeroDecimaliImponibile = 2;
// ctx.Dispose();
}
在调试时,我注意到:
if (creazioneDocumento == null || creazioneDocumento.Count == 0) return;
对象不会被记住,但只要我运行“max”,对象就会保留在内存中。
这是来自 dotmemory 的屏幕截图:
相反,这个屏幕截图告诉我哪些方法可以引用并保存在我的 loginviewmodel 内存中,我相信它们是最大的两个:
【问题讨论】:
-
你知道你没有在 GC 环境中证明内存泄漏吗?您所做的只是证明尚未进行垃圾收集的对象还没有内存不足。在进行第二次测量之前,您错过了 GC 运行的证明。投票结束 - 无法复制。
-
@TomTom 当 dotMemory 获取快照时,它会执行完整的垃圾回收,因此如果内存中有对象,则意味着它们被某些根持有。 Brux88:我看到不是 LoginViewModel 本身的实例,而是一些带有闭包的 lambda 实例由其他一些代表保存在内存中。如果没有 LoginViewModel 类的源代码,就不可能再说什么了。
-
其实和我想的一样。但我不明白如何释放内存。问题是当我执行此行时: var decimaliQuantita = creazioneDocumento.Max(x => x.NumeroDecimaliQuantita); .....我该如何解决?
-
在网上看的,我找到了这篇文章:blog.jetbrains.com/dotnet/2014/07/24/… 所以我认为问题表达式 lambda 翼,它是保留在内存中。这是正确的?我使用了很多 lambda 表达式,我该如何解决? daverro 在使用 lambda 保留所有这些内存对象时遇到问题?
标签: c# entity-framework memory-leaks