如何在.NET中排序通用列表时修复内存泄漏?
private void ManageXmlIndex(XmlDocument xmlDocIndicatorIndex)
{
indexList = repoManager.ParseIndex(xmlDocIndicatorIndex);
indexList.Sort((x, y) => y.Created.CompareTo(x.Created));
view.UpdateIndex(indexList);
}



当我使用linq OrderBy时,也会发生同样的情况。
定制比较功能能解决问题吗?
错误发生的原因是List.Sort。当我注释掉Sort行时,bug就消失了。
发布于 2015-07-27 10:48:27
你看到的不是记忆泄露。这只是编译器将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委托。同样的行为是在方法调用中发生的。
注意,这种行为是pre的。通过创建一个显示类而不是静态委托来Roslyn changes the way delegates are cached,即使在没有捕获变量的情况下也是如此。
发布于 2015-07-27 10:10:19
我从微软支持处找到了一个答案:
List<T>在其静态构造函数中创建一个空的T数组。该数组存储在List<T>的静态字段中,因此它将处于活动状态,直到AppDomain死亡。所以,不是内存泄露。
我希望这能支持你的问题。
https://stackoverflow.com/questions/31650128
复制相似问题