1

注意:问题可能与重复,仍然发布以获取有关此问题的更新。

我正在组件中创建多个(超过 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 内存会分配给应用程序。

4

2 回答 2

2

在您所说的问题中,您正在雇用WinDbg. 使用WinDbg,您可以找到这些对象的引用并尝试在代码中删除它们。请参阅诊断 .net 内存泄漏

此外,流文档对象或流文档对象的属性可能正在使用非托管资源,这些资源应由实现IDisposable接口释放;如需进一步的建议,您需要共享代码。

于 2013-01-21T14:17:59.560 回答
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;
    }
}
于 2013-05-01T13:40:54.320 回答