注意:该问题可能与this重复,但仍会将其发布以获取有关此问题的更新。
我正在组件中创建多个(超过1000k,不在循环中但在需要时)流文档的对象,并且由于内存不足异常导致应用程序崩溃。使用.NET分析器后,我发现了多个对象仍在记忆中。
我创建了一个用于模拟的测试应用程序来获取详细信息。我发现使用后对象都在内存中(WinDbg帮我识别了这个)。简而言之,如果创建了5000个FlowDocument对象,即使在1秒的间隔后调用GC.Collect,我发现仍然为应用程序分配了~600MB。只有在关闭应用程序后才会释放内存。
有没有人找到解决方案来清除分配给FlowDocument的内存?
守则如下
private void CreateObjects()
{
for (int index = 0; index < 5000; index++)
{
FlowDocument fd = new FlowDocument();
//Opacity is accessed just to use any property of object. It does not have any significance.
var ff = fd.Foreground.Opacity;
}
}
如上所述,我也在1秒后调用GC.Collect来释放内存。如果我不调用GC.Collect,则会为应用程序分配~1.2 GB内存。
答案 0 :(得分:2)
在您提出的问题中,您表示您正在使用WinDbg
。使用WinDbg
,您可以找到这些对象的引用,并尝试在代码中删除它们。参考diagnose a .net memory leak
此外,Flow Document对象或流文档对象的属性可能正在使用非托管资源,这些资源应通过实现IDisposable
接口来释放;如需进一步的建议,您需要共享代码。
答案 1 :(得分:0)
尝试不为每个循环分配变量
private void CreateObjects()
{
FlowDocument fd;
for (int index = 0; index < 5000; index++)
{
fd = new FlowDocument();
//Opacity is accessed just to use any property of object. It does not have any significance.
var ff = fd.Foreground.Opacity;
}
}