列表<t>排序内存泄漏

时间:2015-07-27 09:59:05

标签: c# .net linq memory-leaks

如何在.NET中对通用列表进行排序时修复内存泄漏?

private void ManageXmlIndex(XmlDocument xmlDocIndicatorIndex)
{
    indexList = repoManager.ParseIndex(xmlDocIndicatorIndex);
    indexList.Sort((x, y) => y.Created.CompareTo(x.Created));
    view.UpdateIndex(indexList);
}

enter image description here

enter image description here

enter image description here

当我使用linq OrderBy时会发生同样的情况。

自定义比较功能可以解决问题吗?

由于List.Sort错误发生。当我注释掉Sort行时,错误消失了。

2 个答案:

答案 0 :(得分:2)

您所看到的不是内存泄漏。它只是编译器在调用站点将Comparison<IndicatorPropReport>缓存为static委托的方式,因此无需为每次调用创建它的实例。

如果你看一下这个简化的例子:

var ints = new List<int> { 3, 2, 1, 8, 5 };
ints.Sort((x, y) => x.CompareTo(y));

看看编译器使用.NET反编译器生成的内容:

[CompilerGenerated]
private static Comparison<int> CS$<>9__CachedAnonymousMethodDelegate2;

public static void Main(string[] args)
{
    List<int> ints = new List<int> { 3,2,1,8,5 };
    List<int> arg_51_0 = ints;

    if (Program.CS$<>9__CachedAnonymousMethodDelegate2 == null)
    {
        Program.CS$<>9__CachedAnonymousMethodDelegate2 = 
                new Comparison<int>(Program.<Main>b__1);
    }
    arg_51_0.Sort(Program.CS$<>9__CachedAnonymousMethodDelegate2);
}

[CompilerGenerated]
private static int <Main>b__1(int x, int y)
{
    return x.CompareTo(y);
}

您看到Comparsion<int>已缓存为static代理人。在方法调用中会发生相同的行为。

注意此行为是Roslyn之前的行为。 Roslyn changes the way delegates are cached通过创建显示类而不是静态委托,即使没有捕获的变量。

答案 1 :(得分:1)

我从Microsoft支持中找到了答案:

  

List<T>在其静态构造函数中创建一个空数组T。该   数组存储在List<T>的静态字段中,因此它将一直存在直到   AppDomain死了。所以,不是内存泄漏。

来源:https://social.msdn.microsoft.com/forums/vstudio/en-US/dee3c1ee-fb63-43f1-88be-413136afe3ed/memory-leak-in-generic-collection

我希望能够支持你的问题。