从内存中删除flowdocument对象

时间:2013-01-21 14:11:14

标签: c# memory-management memory-leaks flowdocument

注意:该问题可能与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内存。

2 个答案:

答案 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;
    }
}